[英]sequential and parallel processing of promises
這個想法是順序地迭代數組,但是並行處理子數組中的每個項目。
記錄#1並行處理后,便移至記錄#2並並行處理其項,依此類推。 因此,基本上,這是順序性和並行性的結合。
Concat將所有結果合並為一個維數組並顯示。 (待定)
如果輸入包含數組數組。
var items = [
["item1", "item2"],
["item3", "item4"],
["item5", "item6"],
["item7", "item8"],
["item9", "item10"]
]
以及處理這些項目的動作。
function action(item) {
return new Promise(function(resolve, reject){
setTimeout(function(){
resolve(item + ":processed");
}, 100)
});
}
嘗試
describe("", function(){
this.timeout(0);
it("should", function(done){
items.reduce(function(accumulator, currentValue, currentIndex, array){
return accumulator.then(function(result){
return new Promise(function(resolve, reject){
Promise.all(currentValue.map(action))
.then(resolve, reject);
});
});
}, Promise.resolve())
});
});
期望 :
理想情況下,將結果返回給調用方的干凈簡潔且實用的方法 ( 無狀態 )。
嘗試2
var chain = items.reduce(function(accumulator, currentValue, currentIndex, array){
return accumulator.then(function(result){
return new Promise(function(resolve, reject){
Promise.all(currentValue.map(action))
.then(resolve, reject);
});
});
}, Promise.resolve());
chain.then(console.log, console.error); // I need all results here
僅顯示最后一個結果。 ['item9:processed','item10:processed']
根據答案編輯最終解決方案。
var chain = items.reduce(function(accumulator, currentValue, currentIndex, array){
return accumulator.then(function(result){
return new Promise(function(resolve, reject){
Promise.all(currentValue.map(action))
.then(function(data){
resolve(result.concat(data)) // new array
}, reject);
});
});
}, Promise.resolve([]));
chain.then(console.log, console.error);
一種方法是:
var items = [ ["item1", "item2"], ["item3", "item4"], ["item5", "item6"], ["item7", "item8"], ["item9", "item10"] ] function action(item) { return new Promise(function(resolve, reject){ setTimeout(function(){ resolve(item + ":processed"); }, 100) }); } function process(items) { return items.reduce((m, d) => { const promises = d.map(i => action(i)); let oldData; return m.then((data) => { oldData = data; return Promise.all(promises); }) .then(values => { //oldData.push(...values); oldData.push.apply(oldData, values); return Promise.resolve(oldData); }) }, Promise.resolve([])) } process(items).then(d => console.log(d)) //Prints: // ["item1:processed","item2:processed","item3:processed","item4:processed","item5:processed","item6:processed","item7:processed","item8:processed","item9:processed","item10:processed"]
一個簡單的功能方法是
Promise.all()
生成的promises數組 .then()
的階段Promise.all() in a recursive fashion
ES6; 諸如spread syntax
/ rest parameters
和數組解構之類的工具對於這項工作非常方便。
var items = [["item1", "item2"], ["item3", "item4"], ["item5", "item6"], ["item7", "item8"], ["item9", "item10"]], act = i => new Promise(v => setTimeout(v, 1000, `${i}: processed`)), seqps = ([is,...iss]) => is && Promise.all(is.map(i => act(i))) .then(([p,q]) => (console.log(`${p} and ${q}`), seqps(iss))); seqps(items);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.