Come posso fare in modo che una promessa JavaScript restituisca qualcosa di diverso da una promessa?


38

Ho una specifica da un client per l'implementazione di un metodo in un modulo:

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

Se viene fornita una serie di generi,

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

Ecco un metodo scheletro con una promessa:

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

  return promise;
};

Si può fare la promessa di restituire i dati trovati nei generi? Esiste un modo migliore per ottenere la descrizione delle specifiche?


8
Le promesse non "restituiscono" i valori, ma li passano a un callback (che tu fornisci con .then ()). Le specifiche mi sembrano semplicemente confuse. Probabilmente sta cercando di dire che dovresti fare resolve([genre1, genre2, ...]);all'interno dell'implementazione della promessa.
Ixrec,

Risposte:


40

Sembra che tu non stia capendo come vengono usate le promesse. Restituisci una promessa. Quindi, più tardi, quando il codice risolve la promessa, la risolve con un risultato e quel risultato viene passato al .then()gestore collegato alla promessa:

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
});

5
Ciò conferma che le promesse funzionano come mi aspettavo.
Sealocal

Probabilmente, non capisci perché questo potrebbe essere necessario. In ambiente, come React Native con Redux con Realm, devo mettere lo stato iniziale in Redux createStore. Dovrebbe essere recuperato dal Reame, ma restituisce promessa. Voglio solo bloccare fino a quando non restituisce i dati in quanto questo dovrebbe essere molto veloce e semplice. Invece ho problemi su come combinare le promesse di Realm e il solito oggetto JSON per createStore ()
likern

26

Versione aggiornata usando awaitanziché .then().

awaitinterrompe l'esecuzione fino a quando la Promessa non viene risolta (ovvero, ha un valore). Diversamente dall'uso .then(), puoi semplicemente mantenere awaiti valori mentre esegui varie funzioni che restituiscono promesse e l'esecuzione continua sulla riga successiva (questo si chiama "stile diretto"). È anche molto più bello da guardare, poiché è coerente con il resto di JavaScript, che .then()ovunque.

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

Attendere è supportato in tutti i browser e nodi correnti


1
Oh hey wow guarda, 3 domande SE su questo argomento e finalmente abbiamo una risposta reale!
Andrew,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.