Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

81
Visualizações
Promesa no respetada

He estado golpeando mi cabeza contra esto por un tiempo y no puedo resolverlo.

Tengo main.js que crea una instancia de un objeto de usuario y la consola registra un valor de él.

principal.js

 jsUser = new user(); console.log(jsUser.passTimes);

Luego tengo el archivo user.js, que alberga la clase y obtiene los datos para passTimes

usuario.js

 class user{ // construct the object constructor(obj){ // just set stuff up, cuz why not? this.pTimes = []; } loadPTimes(){ // return a promise return new Promise((res,rej)=>{ $.ajax({ url: './data/importantfile', type: 'post', dataType: 'json', data: { method: 'getData', termCode: termCode }, success: (data)=>{ // trigger the resolve res({ data: data, class: this }); } }); }); } get passTimes(){ // if pTimes is empty, or gone for some reason, do the following if( this.pTimes === undefined || this.pTimes.length == 0 ){ // go get that promise and do stuff this.loadPTimes().then((obj)=>{ // mom always told me I have value, and now I can prove it this.pTimes = obj.data; // send me up the chain return this.pTimes; }); }else{ // I always had value :), great send me up return this.pTimes; } } }

Bastante fácil, ¿verdad? Sin embargo, cuando la página realmente carga, el archivo console.log se activa mientras la promesa/ajax aún se está ejecutando y devuelve undefined. No es lo que esperaba.

Lo que estaba tratando de hacer es, si se activa la función de obtención y no tenemos un valor establecido; vaya a obtener los datos usando ajax y espere a que esos datos regresen antes de devolver algo.

He reescrito esto de muchas maneras diferentes con diferentes resultados, pero no el resultado que estaba buscando (console.log devuelve los resultados reales de ajax).

Esperaba que alguien aquí haya usado un patrón similar, o uno mejor. Que espera datos antes de regresar.

Editado:

Tal vez mis preguntas fueron escritas con suficiente claridad. Necesito datos ajax, cuando se construye la clase o cuando se llama a la función de obtención . Tiene que estar alli.

No puede ser asíncrono porque esos datos se necesitan casi de inmediato. Así que lanzo la solicitud en una promesa, esperando que se respete la promesa y que la función get regrese cuando tenga datos.

Esto no está sucediendo, en cambio, get está devolviendo undefined como un valor mientras la solicitud de ajax aún está esperando una respuesta.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Esto debería solucionar tu problema:

 class user{ // construct the object constructor(obj){ // just set stuff up, cuz why not? this.pTimes = []; } loadPTimes(){ // return a promise return new Promise((res,rej)=>{ $.ajax({ url: './data/importantfile', type: 'post', dataType: 'json', data: { method: 'getData', termCode: termCode }, success: (data)=>{ // trigger the resolve res({ data: data, class: this }); } }); }); } get passTimes(){ return (async () => { // if pTimes is empty, or gone for some reason, do the following if( this.pTimes === undefined || this.pTimes.length == 0 ){ // go get that promise and do stuff const obj = await this.loadPTimes(); // mom always told me I have value, and now I can prove it this.pTimes = obj.data; // send me up the chain return this.pTimes; }else{ // I always had value :), great send me up return this.pTimes; } })(); } }

passTimes devolverá una promesa, por lo que para obtener el valor debe usar await o then/catch closure

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda