2016-05-21 4 views
7

私は次のコードを持っています。fileStatsPromisesPromise<Stats>[]です。foobarPromise<Stats>[]です。それらを待つ正しい方法は何ですか?私は<Stats>[]を取得したいと思います。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:最小の例です。 Screenshot

+0

あなたのコードはかなり不完全である

barは配列になります。実際に実行できる( 'stat'の定義を含む)例を提供できますか?それとは別に、 'fileStatsPromises'がPromiseの配列であれば、2番目のオプション(' bar')でうまくいくはずです。 – nils

+0

これはtypescriptによって引き起こされるバグのようです。なぜなら、 'bar'を記録すると、コンソールは実際に10 'hello'を出力するからです。 – Zen

答えて

-3

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

は、私はあなたが何を意味するかわからないんだけど、多分 bar.then(function(){ alert('complete') })

+0

'async/await'を試してみませんか? – Zen

12

これは正しいです:

const bar = await Promise.all(promiseArray); 

await Promise.all([...])は約束の配列を受け取り、配列を返します結果の['hello', ..., 'hello']

あなたはまた、結果の配列を分解することができます:

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

なぜこれがupvotedされたのか分かりません - "await"を使用すると、有効なjs構文でさえありません... –

+4

@Everyone_Else質問はTypeScriptも要求します。これは有効なJS(ES2017)で、Node.js 7と8の最新バージョンで動作します。古いバージョンのJSが必要な場合は、ソースをBabelのような方法で実行できます。 – Westy92

関連する問題