2017-02-20 36 views
2

さらに進める前に、私が解決しなければならない約束がいくつかあります。ES6 Promise.allの進捗状況

Promise.all(promises).then((results) => { 
    // going further 
}); 

Promise.all約束の進捗状況はありますか?

文書からは、it is not possibleと表示されます。そしてthis questionも答えません。だから、

  • あなたは、これは有用であろうことに同意しないのですか?この機能をクエリしてはいけませんか?
  • これはどうやって手動で実装できますか?
+0

あなたはいつも 'promises'配列の長さを持つことができ、各約束コールバックから 'incrementCount()'のような関数を使ってシェア変数値をインクリメントし、同じオブジェクト上で 'resolve * reject/reject.length'を返す' getPercent() 'のような関数を作成します。約束する。 – ishaan

+0

'promise.all()'に配列をプッシュする前に、各プロミスに '.then()'を追加してpromise.progress()をシミュレートすることができます。余分なオーバーヘッドがありますが、便利です。 – Shilly

答えて

4

私はあなたがを再利用することができます小さなヘルパー関数をノックしました。

基本的には通常どおり約束を渡し、そしてあなたが進歩してやりたいコールバックを提供...

function allProgress(proms, progress_cb) { 
 
    let d = 0; 
 
    progress_cb(0); 
 
    proms.forEach((p) => { 
 
    p.then(()=> {  
 
     d ++; 
 
     progress_cb((d * 100)/proms.length); 
 
    }); 
 
    }); 
 
    return Promise.all(proms); 
 
} 
 

 
function test(ms) { 
 
    return new Promise((resolve) => { 
 
    setTimeout(() => { 
 
     console.log(`Waited ${ms}`); 
 
     resolve(); 
 
    }, ms); 
 
    }); 
 
} 
 

 

 
allProgress([test(1000), test(3000), test(2000), test(3500)], 
 
    (p) => { 
 
    console.log(`% Done = ${p.toFixed(2)}`); 
 
});

2

完成したものを数えるために、各約束に.then()を追加できます。 何かのように:

var count = 0; 
 

 
var p1 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 5000, 'boo'); 
 
}); 
 
var p2 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 7000, 'yoo'); 
 
}); 
 
var p3 = new Promise((resolve, reject) => { 
 
    setTimeout(resolve, 3000, 'foo'); 
 
}); 
 

 
var promiseArray = [ 
 
    p1.then(function(val) { 
 
    progress(++count); 
 
    return val 
 
    }), 
 
    p2.then(function(val) { 
 
    progress(++count); 
 
    return val 
 
    }), 
 
    p3.then(function(val) { 
 
    progress(++count); 
 
    return val 
 
    }) 
 
] 
 

 
function progress(count) { 
 
    console.log(count/promiseArray.length); 
 
} 
 

 
Promise.all(promiseArray).then(values => { 
 
    console.log(values); 
 
});

関連する問題