2017-02-20 57 views
2

我有幾個承諾,我需要在繼續之前解決。ES6 Promise.all progress

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

有什麼方法可以讓我有Promise.all承諾的進展如何?

從文檔看來,似乎是it is not possiblethis question也不回答。

所以:

  • 你不同意,這將是有益的?我們不應該查詢這個功能嗎?
  • 現在如何手動實現它?
+0

你總是可以有'promises'數組的長度和從每個承諾回調增量使用像'incrementCount()'這樣的函數創建一個共享變量值,並且在同一個對象上創建一個像getPercent()這樣的函數,當每個解析或拒絕發生時返回'counter * 100/promises.length'諾言。 – ishaan

+0

您可以在將Promise.all()推送到數組之前,通過爲每個promise添加'.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()來計算完成的whos。 類似:

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