参考:三人の兄弟が.ALL()、.race()、.allSettled()で約束
約束されている
簡単に要約:
1、promise.all()
- Promise.all()メソッドは配列をパラメーターとして受け入れ、p1、p2、およびp3はすべてPromiseインスタンスです
- p1、p2、およびp3の状態が満たされた場合にのみ、pの状態が満たされます。このとき、p1、p2、およびp3の戻り値は配列を形成し、これはpのコールバック関数に渡されます
- p1、p2、p3のいずれかが拒否される限り、pのステータスは拒否され、最初の拒否されたインスタンスの戻り値がpのコールバック関数に渡されます。
2、promise.race()
- p1、p2、およびp3の1つのインスタンスが最初に状態を変更する限り、pの状態はそれに応じて変化します。最初に変更されるPromiseインスタンスの戻り値は、pのコールバック関数に渡されます
3、promise.allSettled()
- p1、p2、p3インスタンスのみがすべて結果を返します。それが満たされているか拒否されているかに関係なく、パッケージングインスタンスは終了します
したがって、Promise.all()はすべてのリクエストが終了したことを確認できません。すべての着信非同期操作のすべての結果を知る必要がある場合、またはこれらの非同期操作がすべて終了したかどうかを知る必要がある場合は、promise.allSettled()を使用する必要があります
4. promise.allとpromise.allSettledの違い
- 同じパラメータに対応する異なる処理方法
- Promise.allSettled()パラメータのpromiseが満たされているか拒否されているかに関係なく、パラメータのインスタンスが結果を返すのを待ってから、パッケージインスタンスが終了します。
- Promise.all()は、受け入れられたすべてのpromiseインスタンスが満たされた場合にのみ、Promise.all([p1、p2、p3])。then()メソッドに移動します。promiseインスタンスの1つが拒否されている限り、直接キャッチしてメソッド、およびキャッチは拒否される最初のプロミスのエラーのみを返します
- パッケージングインスタンス自体の場合
- Promise.allSettled()が結果を返すと、パッケージングインスタンス自体は常に満たされます
- Promise.all()は、受け入れられたパラメータのすべてのpromiseインスタンスが実現状態になり、パッケージングインスタンス自体がフルフィルになることを条件とする必要があります。それ以外の場合、受け入れられたパラメータの1つが拒否されると、パッケージングインスタンスは拒否されます。
- 返されるデータ構造
- Promise.allSettled()によって受け入れられた結果は、パラメーターを入力するときのpromiseインスタンスに対応し、結果の各アイテムは対応しています
const resolved = Promise.resolve(42);
const rejected = Promise.reject(-1);
const allSettledPromise = Promise.allSettled([resolved, rejected]);
allSettledPromise.then(function (results) {
console.log(results);
});
// [
// { status: 'fulfilled', value: 42 },
// { status: 'rejected', reason: -1 }
// ]
- Promise.all()は、入力パラメーターのすべてのpromiseインスタンスが満たされた場合にのみPromise.all()。then()メソッドになります。返される結果も入力パラメーターと1対1で対応し、結果には実際の解決の結果
5. promise.allを使用してpromise.allSettledを実装します
Promise.allSettled = function(list) {
if (list instanceof Array) {
let res = [];
list.forEach((i) => {
res.push(
new Promise(function(resolve, reject) {
i.then((v) => {
resolve({state:true, data: v});
}).catch((e) => {
reject({state: false, data: e});
});
})
);
});
return Promise.all(res);
}
return Promise.reject();