2016-05-21 8 views
7

Ich habe folgenden Code, fileStatsPromises ist von Promise<Stats>[], beide foo und bar sind Promise<Stats>[]. Was ist der richtige Weg, um sie zu erwarten? Ich möchte <Stats>[] bekommen.Wie warte ich auf eine Liste von Versprechen in JavaScript/TypeScript?

const files = await readDir(currentDir); 
    const fileStatsPromises = files.map(filename => path.join(currentDir, filename)).map(stat); 

    const foo = await fileStatsPromises; 
    const bar = await Promise.all(fileStatsPromises); 

EDIT: ein minimales Beispiel.

function makePromise() { 
    return Promise.resolve("hello"); 
} 
const promiseArray = []; 
// const promiseArray = [] as Promise<string>[]; 
for (let i = 0; i < 10; i++) { 
    promiseArray.push(makePromise()); 
} 

(async() => { 
    const foo = await promiseArray; 
    const bar = await Promise.all(promiseArray); 
})(); 

Screenshot

+0

Ihr Code ist ziemlich unvollständig. Können Sie ein Beispiel angeben, das tatsächlich ausgeführt werden kann (einschließlich einer Definition von "stat")? Abgesehen davon, wenn 'fileStatsPromises' ein Array von Promises ist, sollte Ihre zweite Option (' bar') in Ordnung sein. – nils

+0

Dies scheint ein Fehler zu sein, der durch Typoskript verursacht wird, da die Konsole tatsächlich 10 'Hallo' ausgibt, wenn ich 'Balken' logge. – Zen

Antwort

-3

Ich bin nicht sicher, was du meinst, aber vielleicht bar.then(function(){ alert('complete') })

+0

Haben Sie nicht versucht Async/erwarten? – Zen

12

Das ist richtig:

const bar = await Promise.all(promiseArray); 

await Promise.all([...]) eine Reihe von Versprechungen nimmt und gibt ein Array von Ergebnissen.

bar wird ein Array sein: ['hello', ..., 'hello']

Sie können auch das resultierende Array dekonstruieren:

const [bar1, ..., bar10] = await Promise.all(promiseArray); 
console.log(bar1); // hello 
console.log(bar7); // hello 
+0

Nicht sicher, warum das upvoted wurde - die Verwendung von "erwarten" bewirkt, dass dies nicht einmal gültig ist js Syntax ... –

+4

@Everyone_Else die Frage fragt auch nach TypeScript. Außerdem ist dies gültig JS (ES2017) und funktioniert in neueren Versionen von Node.js 7 und 8. Wenn Sie eine ältere Version von JS benötigen, können Sie Ihre Quelle durch etwas wie Babel ausführen. – Westy92

Verwandte Themen