web-dev-qa-db-fra.com

Comment puis-je faire une promesse JavaScript renvoyer autre chose qu'une promesse?

J'ai une spécification d'un client pour une implémentation d'une méthode dans un module:

 // getGenres():
 //  Returns a promise. When it resolves, it returns an array.

Si on leur donne un éventail de genres,

['comedy', 'drama', 'action']

Voici une méthode squelette avec une promesse:

MovieLibrary.getGenres = function() {
  var promise = new Promise(function(resolve, reject) {
    /* missing implementation */
  });

  return promise;
};

Peut-on promettre de restituer les données trouvées dans les genres? Existe-t-il un meilleur moyen d'obtenir la description des spécifications?

42
sealocal

Il semble que vous ne compreniez pas comment les promesses sont utilisées. Vous retournez une promesse. Ensuite, plus tard, lorsque votre code résout la promesse, il la résout avec un résultat et ce résultat est transmis au gestionnaire .then() attaché à la promesse:

MovieLibrary.getGenres = function() {
  var promise = new Promise(function(resolve, reject) {
    /* missing implementation */
    resolve(result);
  });

  return promise;
};

MovieLibrary.getGenres().then(function(result) {
    // you can access the result from the promise here
});
45
jfriend00

Version mise à jour utilisant await plutôt que .then().

await arrête l'exécution jusqu'à ce que la promesse soit résolue (c'est-à-dire qu'elle ait une valeur). Contrairement à l'utilisation de .then(), vous pouvez simplement conserver les valeurs de awaiting lorsque vous exécutez diverses fonctions qui renvoient des promesses, et l'exécution continue sur la ligne suivante (c'est ce qu'on appelle le "style direct). C'est aussi beaucoup plus agréable à regarder, car il est cohérent avec le reste de JavaScript, que .then() partout.

// Example function that returns a Promise that will resolve after 2 seconds
var getGenres = function() {
  return new Promise(function(resolve) {
    setTimeout(function(){
      resolve(['comedy', 'drama', 'action'])
    }, 2000);
  });
}

// We start an 'async' function to use the 'await' keyword
(async function(){
  var result = await getGenres()
  console.log('Woo done!', result)

  // But the best part is, we can just keep awaiting different stuff, without ugly .then()s
  var somethingElse = await getSomethingElse()
  var moreThings = await getMoreThings()
})()

Await est pris en charge dans tous les navigateurs et nœuds actuels

34
mikemaccana