将嵌套的'for'循环转换为Promise,Promise? 嵌套承诺?

我有一个数组,其中的值是由“/”分隔的序列,以及一个“ mapSeries ”Promise(用于连续迭代映射的辅助函数),循环遍历每个序列中的每个值。

现在,声明开始于一个嵌套的“for”循环,它将一个序列分割成若干个string,然后将这些值传递给一个空的数组,以交给“mapSeries”的承诺。

经过testing,事实certificate,这只适用于原始数组有一个序列,因为多个序列并行运行。

这怎么能被写成一个承诺,对每个序列连续运行,然后连续地为给定序列中的每个元素?

这里是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(); } 

这部分代码看起来很没用,因为elementssequence相同,推送不是asynchronous的,所以你也可以使用for循环:

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

你也可能在那里有一个错误

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

永远不会执行 – 它是在一个return语句之后; 并且不会等待asynchronous结果。

你的代码应该简单地省略这些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 }); }); }); 

顺便说一句,而不是那个自定义mapSeries实现,我build议使用蓝鸟的“本地” map方法 concurrency选项设置为1

一些快速,丑陋,没有经过testing的例子,但我希望你有这样的想法:

 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(){ // ... })