2016-04-21 20 views
12

Voglio eseguire il mio codice nel seguente ordine:Come concatenare un Promise.all con altre promesse?

  1. promessa 1
  2. Attendere 1 da fare, poi fare Promessa 2 + 3, allo stesso tempo
  3. funzione finale attende Promessa 2 +3 da fare

Sto avendo qualche problema a capire, il mio codice finora è sotto.

function getPromise1() { 
    return new Promise((resolve, reject) => { 
    // do something async 
    resolve('myResult'); 
    }); 
} 

function getPromise2() { 
    return new Promise((resolve, reject) => { 
    // do something async 
    resolve('myResult'); 
    }); 
} 

function getPromise3() { 
    return new Promise((resolve, reject) => { 
    // do something async 
    resolve('myResult'); 
    }); 
} 

getPromise1() 
.then(
    Promise.all([getPromise2(), getPromise3()]) 
    .then() // ??? 
) 
.then(() => console.log('Finished!')); 
+1

Come ha spiegato adeneo, qualsiasi cosa tu ritorni da un gestore allora viene passata al gestore successivo –

risposta

27

Basta tornare Promise.all(...

getPromise1().then(() => { 
    return Promise.all([getPromise2(), getPromise3()]); 
}).then((args) => console.log(args)); // result from 2 and 3 
+0

o usa 'spread' se vuoi concatenare un altro promesso in modo pulito;) – Yerken

+3

@Yerken' spread' è grande, ma isn è un'estensione di 'Bluebird', e non ES6? –

+1

scusa, hai ragione. Ma speriamo che un giorno diventerà parte dello standard :) – Yerken

4

Lo so che è un vecchio thread, ma non è

() => {return Promise.all([getPromise2(), getPromise3()]);} 

un po 'superfluo? L'idea della freccia grasso è che si può scrivere come:

() => Promise.all([getPromise2(), getPromise3()]) 

che rende il codice risultante un po 'più chiaro:

getPromise1().then(() => Promise.all([getPromise2(), getPromise3()])) 
.then((args) => console.log(args)); // result from 2 and 3 

Comunque, grazie per la risposta, mi è stato bloccato con questo :)