2
votes

Besoin de comprendre pourquoi les résultats de Promise pour la fonction en ligne ne se résolvent pas au résultat de retour prévu

Je travaille pour en savoir plus sur les promesses JavaScript et j'ai rencontré un problème en essayant de combiner une logique de promesse à partir de fonctions séparées en une seule fonction en ligne. Quand j'ai tout rassemblé dans une seule fonction en ligne, il en résulte un résultat «indéfini» pour le résultat de retour des promesses au lieu de la valeur «monde» prévue.

[FONCTIONNE comme prévu, où il résout la promesse de manière asynchrone, et aboutit à "monde" pour la réponse de promesse]

var helloResult = async () => { 
                await new Promise(r => {
                    setTimeout(r, 3000);
                    return 'world';
                })
                .then((responseData)=> {
                    console.log('COMPLETED Promise Result (Promise completed): ' + responseData)
                })};

[NE FONCTIONNE PAS - Résultats "non défini" au lieu de "monde" pour la réponse de promesse ...]

XXX

[NE FONCTIONNE PAS - Résultats "non définis" au lieu de "monde" pour la réponse de promesse ...]

var helloResult = async (r) => { 
                await new Promise(r => {
                    setTimeout(r, 3000);
                    return 'world';
                })
            };

let helloResponse = helloResult().then((res)=> {
    console.log('COMPLETED Promise Result (Promise completed): ' + res)
})

Pour une raison quelconque la promesse dans les 2 secondes tentatives de changer le code se traduit par «undefined» au lieu de la valeur attendue du résultat de retour de «world».

Tout conseil est apprécié, merci pour votre aide.


1 commentaires

async doit être dans le rappel get en premier lieu ( async (request, response) => {), si vous prévoyez de maintenez la valeur de la réponse de promesse sur helloResult . Emballer les choses à l'intérieur dans async ne fera aucune magie tant que le rappel parent n'est pas marqué async .


5 Réponses :


5
votes

Vous revenez du rappel du constructeur Promise dans vos derniers exemples. Cette valeur n'est pas résolue. Vous devez appeler le rappel résoudre pour transmettre la valeur.

await new Promise(r => {
   setTimeout(() => r('world'), 3000);
});


1 commentaires

Excellent! Merci @Daniel, je l'apprécie vraiment, c'est exactement ce qui me manquait.



-1
votes

Vous devriez être en mesure de résoudre ce problème en utilisant une résolution dans votre promesse, comme ceci:

var helloResult = async (r) => { 
                await new Promise(r => {
                    setTimeout(r, 3000);
                    resolve('world');
                })
            };

let helloResponse = helloResult().then((res)=> {
    console.log('COMPLETED Promise Result (Promise completed): ' + res)
})

De même, cela peut être fait pour votre deuxième bloc de code où vous avez enchaîné un puis sur la promesse.


2 commentaires

Non, une promesse attendra que toutes les actions invoquées soient terminées avant d'être résolue.


Je ne pense pas que ce soit juste. Ce code ne fonctionne pas non plus



1
votes

Vous n'avez pas de return dans helloResult () et devez passer l'argument à resolve()

var helloResult = async(r) => {
   return await new Promise(r => {
    setTimeout(r, 500, 'world');
  })
};

let helloResponse = helloResult().then((res) => {
  console.log('COMPLETED Promise Result (Promise completed): ' + res)
})


0 commentaires

1
votes

Je vois la confusion.

var helloResult = async (r) => 
  await new Promise(r => {
    setTimeout(r, 3000, 'world');
  });

// or 

var helloResult = async (r) =>
  await new Promise(r => {
    setTimeout(()=> r('world'), 3000);
  });

Dans le constructeur de promesse, vous pouvez renvoyer une valeur mais elle est ignorée. La valeur transmise le long de la chaîne est celle qui est transmise aux fonctions résoudre ou rejet . Alors quand vous faites:

var helloResult = async (r) => { 
  await new Promise(r => {
    setTimeout(r, 3000);
    return 'world';
  })
};

C'est le même concept. setTimeout appelle resolution ( r ) au bon moment mais ne transmet pas la valeur ('world'). Dans votre cas, vous avez 2 options qui font toutes deux essentiellement la même chose:

new Promise((resolve, reject) => {
  resolve(1);
  return 2;
}).then(v => console.assert(v===1))


0 commentaires

0
votes

À partir de votre deuxième exemple: puis est une méthode sur l'API Promise, vous devez donc renvoyer une promesse de helloResult pour que cela ait un effet. Vous ne résolvez pas non plus cette promesse une fois le délai écoulé.

var helloResult = () => {
  return new Promise(resolve => {
    setTimeout(() => resolve('world'), 3000);
  });
};

(async () => {
  const response = await helloResult();
  console.log(`COMPLETED Promise Result (Promise completed): ${response}`);
})();

Alternativement, si vous souhaitez utiliser async / await , vous pouvez, mais vous devez vous assurer que le code contenant le await se trouve avec un async .

var helloResult = () => {
  return new Promise(resolve => {
    setTimeout(() => resolve('world'), 3000);
  });
};

let helloResponse = helloResult().then((res) => {
  console.log('COMPLETED Promise Result (Promise completed): ' + res)
})


0 commentaires