Promise.allメソッド
Promise.all()は、配列がパラメータであることを受信し、配列のすべてのPromiseがresolveの状態である場合、Promise.all()こそ成功する.失敗が一つあれば、失敗と見なされます.例を挙げます.
疑う必要はありません.上のコードの実行結果はa,b,cです.p 1,p 2,p 3はいずれも成功した状態であるからである.次の例を見てみましょう
この時皆さんの最初の考えはこのallが失敗するのではないでしょうか.ええ、実は私も最初はそう思っていましたが、このコードをよく分析すると、私たちが思っているほど簡単ではありません.次に分析します. p 1は間違いなく成功したに違いない. p 2は関数に直接エラーを投げ出した.しかし、p 2には独自のcatchの関数があり、catch関数は前に投げ出されたエラーをキャプチャすることができることに注意してください. p 2自体がエラーをキャプチャできるのでPromise.all()メソッドではp 1,p 2の2つのPromiseがresolveの状態であるためthenメソッドで指定されたコールバック関数が呼び出される. 次に、Promiseの実装を見てみましょう.all()メソッドのプロセス.やはり,この方法で受信したパラメータが配列でありpromiseオブジェクトを返すことを明確にしなければならない.
var p1 = Promise.resolve('a');
var p2 = Promise.resolve('b');
var p3 = Promise.resolve('c');
Promise.all([p1,p2,p3]).then(function(value) {
console.log(value);
})
疑う必要はありません.上のコードの実行結果はa,b,cです.p 1,p 2,p 3はいずれも成功した状態であるからである.次の例を見てみましょう
var p1 = new Promise((resolve, reject) => {
resolve('hello');
})
.then(result => result)
.catch(e => e);
var p2 = new Promise((resolve, reject) => {
throw new Error(' ');
})
.then(result => result)
.catch(e => e);
Promise.all([p1,p2])
.then(function(value) {
console.log(value);
})
.catch(function(re) {
console.log(re);
})
この時皆さんの最初の考えはこのallが失敗するのではないでしょうか.ええ、実は私も最初はそう思っていましたが、このコードをよく分析すると、私たちが思っているほど簡単ではありません.次に分析します.
function promiseAll(promises){
return new Promise(function(resolve,reject) {
//promises
if(!(promises instanceof Array)) {
throw new TypeError("promises must be an Array");
}
var len = promises.length,
resolvedCount = 0,
resolvedArray = new Array(len);
for(var i = 0;i < len ;i++) {
(function(i) {
Promise.resolve(promises[i])
.then(value => {
resolvedCount++;
resolvedArray[i] = value;
if(resolvedCount == len) {
return resolve(resolvedArray);
}
},re => {
return reject(re);
})
.catch(re => {
console.log(re);
})
})(i)
}
})
}