gpt4 book ai didi

javascript - promise 的顺序和并行处理

转载 作者:行者123 更新时间:2023-11-30 14:40:37 24 4
gpt4 key购买 nike

想法是顺序迭代数组,但并行处理子数组中的每一项。

  1. 一旦记录 #1 被并行处理,它就会移动到记录 #2 并并行处理它的项目,依此类推。所以基本上它是顺序性和并行性的结合。

  2. 将所有结果连接到一维数组中并显示。 (待定)

如果输入包含数组的数组。

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

displays last result only. [ '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"]

关于javascript - promise 的顺序和并行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49726861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com