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