繁体   English   中英

承诺的顺序和并行处理

[英]sequential and parallel processing of promises

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

  1. 记录#1并行处理后,便移至记录#2并并行处理其项,依此类推。 因此,基本上,这是顺序性和并行性的结合。

  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM