it-swarm.com.de

Wie kann ich ein JavaScript-Versprechen dazu bringen, etwas anderes als ein Versprechen zurückzugeben?

Ich habe eine Spezifikation von einem Client für eine Implementierung einer Methode in einem Modul:

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

Wenn eine Reihe von Genres gegeben ist,

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

Hier ist eine Skelettmethode mit einem Versprechen:

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

  return promise;
};

Kann das Versprechen gegeben werden, die in den Genres gefundenen Daten zurückzugeben? Gibt es einen besseren Weg, um die Spezifikationsbeschreibung zu erreichen?

42
sealocal

Es hört sich so an, als würden Sie nicht verstehen, wie Versprechen verwendet werden. Sie geben ein Versprechen zurück. Später, wenn Ihr Code das Versprechen auflöst, löst er es mit einem Ergebnis auf und dieses Ergebnis wird an den an das Versprechen angehängten .then() -Handler übergeben:

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

Aktualisierte Version mit await anstelle von .then().

await wird nicht mehr ausgeführt, bis das Versprechen aufgelöst wurde (dh einen Wert hat). Im Gegensatz zur Verwendung von .then() können Sie awaiting-Werte einfach beibehalten, während Sie verschiedene Funktionen ausführen, die Versprechen zurückgeben, und die Ausführung wird in der nächsten Zeile fortgesetzt (dies wird als "direkter Stil" bezeichnet). Es ist auch viel schöner anzusehen, da es mit dem Rest von JavaScript konsistent ist, als .then() überall.

// 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()
})()

Warten wird in allen aktuellen Browsern und Knoten unterstützt

34
mikemaccana