Promise.allメソッド


Promise.all()は、配列がパラメータであることを受信し、配列のすべてのPromiseがresolveの状態である場合、Promise.all()こそ成功する.失敗が一つあれば、失敗と見なされます.例を挙げます.
 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が失敗するのではないでしょうか.ええ、実は私も最初はそう思っていましたが、このコードをよく分析すると、私たちが思っているほど簡単ではありません.次に分析します.
  • p 1は間違いなく成功したに違いない.
  • p 2は関数に直接エラーを投げ出した.しかし、p 2には独自のcatchの関数があり、catch関数は前に投げ出されたエラーをキャプチャすることができることに注意してください.
  • p 2自体がエラーをキャプチャできるのでPromise.all()メソッドではp 1,p 2の2つのPromiseがresolveの状態であるためthenメソッドで指定されたコールバック関数が呼び出される.
  • 次に、Promiseの実装を見てみましょう.all()メソッドのプロセス.やはり,この方法で受信したパラメータが配列でありpromiseオブジェクトを返すことを明確にしなければならない.
    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)
            }
        })
    }