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

23

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

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

Se viene fornita una matrice di generi,

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

Ecco un metodo skeleton con una promessa:

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

  return promise;
};

Può essere promessa la restituzione dei dati trovati nei generi? C'è un modo migliore per ottenere la descrizione della specifica?

    
posta sealocal 23.04.2015 - 01:03
fonte

2 risposte

23

Sembra che tu non capisca come vengono utilizzate le promesse. Tu restituisci una promessa. Quindi, più tardi, quando il tuo codice risolverà la promessa, la risolverà con un risultato e tale risultato verrà passato al .then() handler associato 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
});
    
risposta data 23.04.2015 - 01:07
fonte
17

Versione aggiornata utilizzando await anziché .then() .

await interrompe l'esecuzione fino a quando la Promessa non è stata risolta. A differenza dell'utilizzo di .then() , puoi semplicemente mantenere await di valori mentre fai varie cose che restituiscono promesse, e l'esecuzione continua sulla riga successiva (questo è chiamato 'stile diretto'). È anche molto più bello da guardare, poiché è coerente con il resto di JavaScript, rispetto a .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()
})()

In attesa è supportato in tutti i browser e nodi correnti

    
risposta data 02.06.2017 - 12:00
fonte

Leggi altre domande sui tag