嵌套节点async.eachSeries
Nesting node async.eachSeries
与异步模块斗争了半天,但在嵌套几个级别时无法使其正常工作。
所以这还可以:
var async=require('async')var myarr=["外部-A","外部-B"];var myarr2=["内部-A","内部-B"];var innerComplete=true;async.echSeries(myarr,function(item,outerCallback){console.log("处理项目"+项目);异步系列([函数(回调){takeTime(2000,项目,回调)},函数(回调){takeTime(1000,项目,回调)},函数(回调){outerCallback();}],函数(错误){console.log("---外部序列---")})},函数(错误){console.log("---OUTER LOOP---")});函数takeTime(ms、msg、callback){console.log("Starting"+ms+"ms task from"+msg);setTimeout(function(){console.log("已完成"+ms+"来自的ms任务"+msg);callback();},ms);}
它按照如下顺序很好地输出所有内容:
处理项目外部-A从外部-A启动2000毫秒任务已完成来自外部-A的2000毫秒任务从外部-A启动1000毫秒任务已完成来自外部-A的1000毫秒任务处理项目外部-B从外部-B启动2000毫秒任务已从外部完成2000毫秒的任务-B从外部-B启动1000毫秒任务已从外部完成1000毫秒的任务-B---外环---
但当我试图将另一个eachSeries循环嵌套到其中时,如下所示:
var async=require('async')var myarr=["外部-A","外部-B"];var myarr2=["内部-A","内部-B"];var innerComplete=true;async.echSeries(myarr,function(item,outerCallback){console.log("处理项目"+项目);异步系列([函数(回调){takeTime(2000,项目,回调)},函数(回调){takeTime(1000,项目,回调)},函数(回调){async.echSeries(myarr2,函数(item2,outerCallback2){console.log("处理项目"+项目2);异步系列([函数(回调2){takeTime(2000,第2项,回调2)},函数(回调2){takeTime(1000,第2项,回调2)}],函数(错误){console.log('---INNER SEQUENCE---')})},函数(错误){console.log("---INNER LOOP---")});outerCallback();}],函数(错误){console.log("---外部序列---")})},函数(错误){console.log("---OUTER LOOP---")});函数takeTime(ms、msg、callback){console.log("Starting"+ms+"ms task from"+msg);setTimeout(function(){console.log("已完成"+ms+"来自的ms任务"+msg);callback();},ms);}
当进入第二个eachSeries循环时,它会丢失执行顺序,如下所示:
处理项目外部-A从外部-A启动2000毫秒任务已完成来自外部-A的2000毫秒任务从外部-A启动1000毫秒任务已完成来自外部-A的1000毫秒任务处理项目内部-A从内部-A启动2000毫秒任务处理项目外部-B从外部-B启动2000毫秒任务已完成来自内部-A的2000毫秒任务从内部-A启动1000毫秒任务已从外部完成2000毫秒的任务-B从外部-B启动1000毫秒任务已完成来自内部-A的1000毫秒任务---内部序列---已从外部完成1000毫秒的任务-B处理项目内部-A从内部-A启动2000毫秒任务---外环---已完成来自内部-A的2000毫秒任务从内部-A启动1000毫秒任务已完成来自内部-A的1000毫秒任务---内部序列---
我也尝试了瀑布、mapSeries等,但执行顺序相同或混乱。我是做错了什么,还是异步模块不支持这样的嵌套?
您没有调用outerCallback2
,也没有调用callback
,而是立即调用outerCallback
。
固定:
async.eachSeries(myarr, function( item, outerCallback) {
,----------------------------------------'
| console.log('Processing item ' + item);
| async.series([
| function(callback) {
| `--------------,
| takeTime(2000, item, callback)
| },
| function(callback) {
| `--------------,
| takeTime(1000, item, callback)
| },
| function(callback) {
| ,-----------'
| | async.eachSeries(myarr2, function( item2, outerCallback2) {
| | ,---------------------------------------------'
| | | console.log('Processing item ' + item2);
| | | async.series([
| | | function(callback2) {
| | | takeTime(2000, item2, callback2)
| | | },
| | | function(callback2) {
| | | takeTime(1000, item2, callback2)
| | | }
| | | ], function(err) {
| | | console.log('---INNER SEQUENCE---')
| | `---> outerCallback2(err); // <<<
| | })
| | }, function(err){
| | console.log("---INNER LOOP---");
| `---> callback(err); // <<<
| });
| }
| ], function(err) {
| console.log("---OUTER SEQUENCE---")
`---> outerCallback(err); // <<<
})
}, function(err){
console.log("---OUTER LOOP---")
console.log("everything done");
});
相关文章:
- jQuery加载的async和ready函数不工作
- 什么'这是从第三个函数上的async 1st函数获得结果的更好方法
- 超过了async.detect最大调用堆栈大小
- 如果数组仍在执行,async.forEach()将运行我添加到数组中的新元素
- node.js应用程序中的async.js问题
- 使用async.parallel时出错
- async.js和系列问题
- async问题,JS Promise无法返回结果,但可以使用console.log
- 在Redux中链接async和sync操作以计算初始状态
- 为什么当async标志设置为false时,xmlhttprequest中的代码可以工作,而当它设置为true时却不能工作
- 使用ajax调用中的数据而不使用async:false
- Node.js时使用async是有意义的
- async.parallel中的回调是如何工作的(它来自哪里?)
- Javascript Async thunk
- async.retry-已调用回调
- async.each 和 async.eachSeries 之间的区别
- async.js:async.eachSeries结果总是抛出未定义的
- Async.js eachSeries在出现错误时未停止
- 嵌套节点async.eachSeries
- 是否可以传递额外的参数给async.eachSeries