繁体   English   中英

将嵌套的“ for”循环转换为Promise,以实现Promise? 嵌套的承诺?

[英]Convert nested 'for' loops into a Promise, for a Promise? Nested Promises?

我有一个数组,其中的值是用“ /”分隔的序列,还有一个“ mapSeries ” Promise(用于映射的串行迭代的帮助函数),它循环遍历每个序列中的每个值。

现在,该语句以嵌套的“ for”循环开始,该循环将序列拆分为字符串,然后将这些值推入一个空数组以移交给“ mapSeries” promise。

经过测试,事实证明这仅在原始数组具有一个序列的情况下有效,因为多个序列并行运行。

如何将其写为对每个序列依次运行然后对给定序列中的每个元素依次运行的promise?

这是for循环的尝试(适用于单个序列):

var sequences = ['one/two/three', 'alpha/beta'];
var elements = [];
for (i=0; i<sequences.length; i++) {
  var series = sequences[i].split("/");
  for (j=0; j<series.length; j++) {
    elements.push(series[j]);
  }
    var items = mapSeries(elements, function(element) {
        // do stuff with 'one', then 'two', then 'three'
        // when done..next series
        // do stuff with 'alpha', then 'beta'
    })
    elements = []; // reset elements array for next series
} // for sequences.length

这是一个无极的尝试(element.charAt ..处的错误):

var sequences = ['one/two/three', 'alpha/beta'];
var elements = [];
var items = mapSeries(sequences, function(sequence) {
    sequence = sequence.split("/");
    return mapSeries(sequence, function(series) {
        elements.push(series);
        return elements;
    }).then(function(elements) {
        return mapSeries(elements, function(element){
            var element = element.charAt(0).toLowerCase() + element.slice(1); // first letter lowercase
            // do stuff with 'one', then 'two', then 'three'
            // when done..next series
            // do stuff with 'alpha', then 'beta'
        });
    });
    elements = []; // reset elements array for next series
});

mapSeries辅助函数:

function mapSeries(things, fn) {
  var results = [];
  return Promise.each(things, function(value, index, length) {
    var ret = fn(value, index, length);
    results.push(ret);
    return ret;
  }).thenReturn(results).all();
}

一些快速,丑陋,未经测试的示例,但我希望您能理解:

var sequences = ['one/two/three', 'alpha/beta'];
var elements = [];
var promise = null;

for (var i = 0; i < sequences.length; i++) {
    (function(series){
        function doStuff() {
            for (var j = 0; j < series.length; j++) {
                elements.push(series[j]);
            }

            return mapSeries(elements, function(element) {
                // async stuff
            })
        }

        if (promise) {
            promise = promise.then(doStuff)
        } else {
            promise = doStuff()
        }
    })( sequences[i].split("/") )
}

promise.then(function(){
    // ...    
})

这部分代码看起来非常无用,因为elementssequence相同,并且推送不是异步的,因此您也可以使用for循环:

 sequence = sequence.split("/"); return mapSeries(sequence, function(series) { elements.push(series); return elements; }) 

另外你可能在那里有一个错误

 elements = []; // reset elements array for next series 

永远不会执行-它在return语句之后; 而且也不会等待异步结果。

您的代码应该简单地省略那些elements数组,而只是

var sequences = ['one/two/three', 'alpha/beta'];
var items = mapSeries(sequences, function(sequence) {
    return mapSeries(sequence.split("/"), function(elements) {
        return mapSeries(elements, function(element) {
            // do async stuff with the element, and return a promise
        });
    });
});

顺便说一句,我建议使用concurrency选项设置为1 Bluebird的“本机” map方法 ,而不是该自定义mapSeries实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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