1. ホーム
  2. javascript

[解決済み] Promise.all().then() resolve?

2022-11-12 13:56:40

質問

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

でも、これって正しいやり方じゃないような...。どうするのが正解なのでしょうか?

どのように解決するのですか?

<ブロッククオート

しかし、それは適切な方法とは思えません...。

それは確かに適切な方法です(少なくとも a の適切な方法です)。これはプロミスの重要な側面で、プロミスはパイプラインであり、データはパイプライン内の様々なハンドラによって加工することができます。

例です。

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]

...最初のハンドラは二つの約束の解決を得るので ( 12 を配列として受け取り、それらをそれぞれ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;
  });

...しかし、非同期であれば、ネストされてしまい、ネストはすぐに手に負えなくなるため、そのようなことはしたくありません。