簡體   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