Promise.all()。then()は解決しますか?


95

ノード4.xの使用。あなたが持っている場合はPromise.all(promises).then()、データを解決し、次にそれを渡すために適切な方法は何ですか.then()

私はこのようなことをしたいです:

Promise.all(promises).then(function(data){
  // Do something with the data here
}).then(function(data){
  // Do more stuff here
});

しかし、データを2番目に取得する方法がわかりません.then()resolve(...)最初は使えません.then()。私はこれを行うことができると思いました:

return Promise.all(promises).then(function(data){
  // Do something with the data here
  return data;
}).then(function(data){
  // Do more stuff here
});

しかし、それはそれを行う適切な方法のようには思えません...これに対する正しいアプローチは何ですか?

回答:


142

しかし、それは適切な方法ではないようです。

それは確かに(あるいは少なくともそれを行うための適切な方法でそれを行うための適切な方法を)。これはプロミスの主要な側面であり、プロミスであり、パイプライン内のさまざまなハンドラーによってデータを処理できます。

例:

const promises = [
  new Promise(resolve => setTimeout(resolve, 0, 1)),
  new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
  .then(data => {
    console.log("First handler", data);
    return data.map(entry => entry * 10);
  })
  .then(data => {
    console.log("Second handler", data);
  });

catch簡潔にするためにハンドラーは省略されています。本番用コードでは、常にプロミスを伝達するか、拒否を処理します。)

その出力は次のとおりです。

最初のハンドラー[1,2]
2番目のハンドラー[10、20]

...なぜなら、最初のハンドラーは2つのpromise(1and 2)の解決を配列として取得し、それぞれに10を掛けた新しい配列を作成して返します。2番目のハンドラーは、最初のハンドラーが返したものを取得します。

あなたがやっている追加の作業が同期している場合は、それを置くことができる最初のハンドラ:

例:

const promises = [
  new Promise(resolve => setTimeout(resolve, 0, 1)),
  new Promise(resolve => setTimeout(resolve, 0, 2))
];
Promise.all(promises)
  .then(data => {
    console.log("Initial data", data);
    data = data.map(entry => entry * 10);
    console.log("Updated data", data);
    return data;
  });

...しかし、それが非同期である場合は、入れ子になってしまい、入れ子がすぐに手に負えなくなるため、そうしたくないでしょう。


1
面白い。ありがとうございました。ではreject、初期Promise関数の後の値にできないのでしょうか?または、チェーンのどこかにエラーをスローすると、.catch()?その場合、rejectそもそも何がポイントなのでしょうか。エラーをスローしないのはなぜですか?再びありがとう
ジェイクウィルソン

6
@JakeWilson:これらは別の質問です。しかし、あなたは2つの別々のものを混乱させています:約束の作成と解決、そして約束の処理。promiseを作成して解決するには、andを使用resolverejectます。あなたがいる場合にはハンドリングあなたの処理が失敗した場合、あなたは確かに、障害パスをトリガーする例外をスローします。もちろん、元のPromiseコールバックから(を使用するのではなくreject)例外をスローすることもできますが、すべての失敗が例外であるとは限りません。
TJクラウダー2015年

1

現在、NodeJSは新しいasync/await構文をサポートしています。これは簡単な構文であり、作業がはるかに簡単になります

async function process(promises) { // must be an async function
    let x = await Promise.all(promises);  // now x will be an array
    x = x.map( tmp => tmp * 10);              // proccessing the data.
}

const promises = [
   new Promise(resolve => setTimeout(resolve, 0, 1)),
   new Promise(resolve => setTimeout(resolve, 0, 2))
];

process(promises)

もっと詳しく知る:


1
プロセスから個々のプロミスにパラメーターを渡すにはどうすればよいですか?@ Aminadav Glickshtein
bhaRATh

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.