2015-12-20 12 views
18

Data una serie di promesse, qual è il modo idiomatico per ottenere i risultati in ES7?ES7 Ottenere risultati da una serie di promesse utilizzando il generatore di attesa

Ecco cosa voglio fare:

async function getImports() { 
    let imports = [System.import('./package1.js'), System.import('./package2.js')]; 
    let promises = await* imports; 
    let results = []; 
    await promises.forEach(val => val.then(data => results.push(data))); //seems hacky 
    console.log(results); // array of 2 resolved imports 
} 

Il risultato è corretto, ma sto ancora facendo un forEach e un then per trasformare le promesse in risultati risolte. Questo non mi sembra giusto. C'è un modo più pulito?

+0

Non 'promises' già contengono i valori risolti? Almeno questo è ciò che 'let result = await * [Promise.resolve (1), Promise.resolve (2)];' fa per me? – m90

+0

Sì, ogni voce in 'promises' contiene un' [[PromiseValue]] ', ma non so come accedervi senza' forEach' e 'then' –

+0

Questo è interessante. Ho appena provato che quanto sopra è stato trasposto da babel e mi ha dato i valori corretti. Cosa usi per il transpiling? – m90

risposta

26

Come accennato nel problema che hai presentato, il problema principale è che await* non è più una cosa ed è stato rimosso. Sfortunatamente, non è stato corretto lanciare un errore di sintassi in Babel 6 ed è stato essenzialmente trattato come un normale await.

Avrai bisogno di esplicitamente

let [p1, p2] = await Promise.all([ 
      System.import('./package1.js'), System.import('./package2.js')]); 
+0

oh uomo, mi spiace sentirlo non si muoverà in avanti, ma grazie per avermi fatto sapere! Se hai a portata di mano, potresti indicarmi un collegamento su esdiscuss o dove mai è stato rifiutato? (questa cosa particolare è difficile da cercare poiché nessun indice motore 'attende * ') –

+2

La specifica è sempre il miglior posto dove guardare. La sintassi delle specifiche proposte è disponibile in https://github.com/tc39/ecmascript-asyncawait/blob/master/spec/syntax.html e definisce solo 'await UnaryExpression'. – loganfsmyth

+0

Potresti dare un'occhiata al metodo Promise.each di bluebird per rendere questo codice più espressivo http://bluebirdjs.com/docs/api/promise.each.html Ci sono ancora buoni motivi per usare anche le librerie di aiuto come Bluebird con ES7 async attendi –

1

non riesco a credere che effettivamente funziona, forEach fa ritorno undefined che non si può await. Se hai bisogno di un ciclo, usa map per ottenere un array di risultati (promessi).

Nel tuo caso, ti sembra di essere alla ricerca di un semplice

async function getImports() { 
    let promises = [System.import('./package1.js'), System.import('./package2.js')]; 
    let results = await Promise.all(promises) 
    console.log(results); 
} 
Problemi correlati