转换嵌套'对于'循环成一个承诺,为了一个承诺?嵌套承诺
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
这里有一个Promise的尝试(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();
}
这部分代码似乎很无用,因为elements
与sequence
相同,推送不是异步的,所以您也可以使用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
});
});
});
顺便说一句,我建议使用Bluebird的"原生"map
方法,而不是自定义的mapSeries
实现,concurrency
选项设置为1
。
一些快速、丑陋、未经测试的示例,但我希望您能理解:
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(){
// ...
})
相关文章:
- 如果类不是一个选项,如何在使用 jQuery 时控制(避免)嵌套 html 元素的样式
- 嵌套到另一个函数中的Fancybox函数;不起作用
- 我怎么能把一个类嵌套在另一个类中呢
- 在Twitter BootStrap嵌套下拉列表中托管一个选择列表(IE 9特定)
- 嵌套承诺会产生类似的效果
- 如何将嵌套设置超时转换为承诺
- 它在另一个函数中嵌套后不会输出文本
- 蓝鸟承诺 - 嵌套与拒绝模式
- 转换嵌套'对于'循环成一个承诺,为了一个承诺?嵌套承诺
- 在JavaScript中,从一组数组递归地构建一个字典/嵌套对象
- 引导表:如何将一个表嵌套到另一个表中
- 定义一个“;嵌套的“;JavaScript中的对象构造函数
- 你能有一个双重嵌套的对象文字吗
- 如何捆绑一个ko.嵌套在对象中的obersavableArray
- Angularjs,等待一个嵌套的承诺
- 如何在Immutable.js中设置一个深度嵌套的值?
- NodeJS -如何发送一个变量嵌套回调?(MongoDB查找查询)
- 如何返回一个嵌套的承诺
- 相同的控制器,相同的模板,相同的资源,但一个是嵌套状态,而另一个不是
- 我想使用jquery获取一个复杂/嵌套的json