Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 转换嵌套的';对于';循环成一个承诺,为了一个承诺?嵌套的承诺?_Javascript_Node.js_Promise_Bluebird - Fatal编程技术网

Javascript 转换嵌套的';对于';循环成一个承诺,为了一个承诺?嵌套的承诺?

Javascript 转换嵌套的';对于';循环成一个承诺,为了一个承诺?嵌套的承诺?,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我有一个数组,其中值是由“/”分隔的序列,还有一个“Promise”(用于带映射的串行迭代的帮助函数),它循环遍历每个序列中的每个值 现在,该语句以一个嵌套的“for”循环开始,该循环将序列拆分为字符串,然后将这些值推送到一个空数组中,以传递给“mapSeries”承诺 经过测试,结果表明,这仅在原始阵列有一个序列时有效,因为多个序列并行运行 如何将其写成一个承诺,对每个序列连续运行,然后对给定序列中的每个元素连续运行? 下面是对for循环的尝试(适用于单个序列): mapSeries辅助函数:

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

现在,该语句以一个嵌套的“for”循环开始,该循环将序列拆分为字符串,然后将这些值推送到一个空数组中,以传递给“mapSeries”承诺

经过测试,结果表明,这仅在原始阵列有一个序列时有效,因为多个序列并行运行

如何将其写成一个承诺,对每个序列连续运行,然后对给定序列中的每个元素连续运行?

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

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(){
    // ...    
})
var序列=['1/2/3','alpha/beta'];
var元素=[];
var-promise=null;
对于(var i=0;i
这部分代码似乎非常无用,因为
元素
序列
相同,并且推送不是异步的,因此您也可以使用
for
循环:

你可能也有一个bug在里面

从不执行-它位于
return
语句之后;而且无论如何都不会等待异步结果

您的代码应该简单地省略那些
元素
数组,只需

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
        });
    });
});

顺便说一句,我建议使用Bluebird的“native”并将其设置为
1

而不是自定义的
mapSeries
实现,您不需要使用
元素
数组,只需使用返回值即可。你能给我们看看你的
mapSeries
helper函数吗?你真的在什么地方使用了异步函数吗?如果是,请显示其调用;如果不是,则不需要
mapSeries
@Bergi这是异步调用:,答案显示mapSeries helperBrilliant。谢谢你
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(){
    // ...    
})
sequence = sequence.split("/");
return mapSeries(sequence, function(series) {
    elements.push(series);
    return elements;
})
elements = []; // reset elements array for next series
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
        });
    });
});