如何在节点 js 中打破内部异步循环
How to break inner async loop in node js
请参阅此代码,为什么内部循环没有中断。我想仅在内部循环条件满足时才推入新数组这应该会中断内部循环的迭代,但外部循环应该像往常一样迭代。
灵感来自
这是我的代码:
var rows = [ RowDataPacket {
id: 1,
title: 'this is jg case',
description: 'this is reply to jg case',
type: 2,
created: Thu Mar 03 2016 12:50:20 GMT+0530 (IST),
group_id: '1,8',
AOI: '1,8' },
RowDataPacket {
id: 2,
title: 'this is jg case',
description: 'this is another reply to jg case',
type: 1,
created: Thu Mar 03 2016 12:55:01 GMT+0530 (IST),
group_id: '3,9',
AOI: '1,8' },
RowDataPacket {
id: 3,
title: 'this is jg case',
description: 'this is again another reply to jg case',
type: 1,
created: Thu Mar 03 2016 12:58:01 GMT+0530 (IST),
group_id: '3,8',
AOI: '1,8' }
];
var filteredRows = [];
async.each(rows, function(row, callback1){
var eachRow = row.group_id.split(',').map(Number);
async.each(eachRow, function(group, callback2){
if(AOI.indexOf(group) !== -1){
filteredRows.push(row);
console.log(group,row);
var fakeErr = new Error();
fakeErr.break = true;
return callback2(fakeErr);
}
callback2();
}, function(err) {
if (err && err.break){
console.log("should break the inner loop and continue for the next outer loop")
callback1();
}
else
callback1(err);
});
}, function(err) {
if (err)
callback(err, null);
callback(null, filteredRows);
});
预期输出 :
var filteredRows = [ RowDataPacket {
id: 1,
title: 'this is jg case',
description: 'this is reply to jg case',
type: 2,
created: Thu Mar 03 2016 12:50:20 GMT+0530 (IST),
group_id: '1,8',
AOI: '1,8' },
RowDataPacket {
id: 3,
title: 'this is jg case',
description: 'this is again another reply to jg case',
type: 1,
created: Thu Mar 03 2016 12:58:01 GMT+0530 (IST),
group_id: '3,8',
AOI: '1,8' }
];
而不是你的代码:
return callback2(fakeErr);
您更改为:
callback2(fakeErr);
return;
你应该返回这里,如果没有,你的程序会收到两个回调
if (err)
callback(err, null);
// return here
return;
callback(null, filteredRows);
>each()
并行运行迭代,你不能"打破循环"(当你这样做时,下一个迭代已经在运行),你必须使用eachSeries()
例如来控制异步流:
// process rows in parallel
async.each(rows, function(row, callback1) {
var eachRow = row.group_id.split(',').map(Number);
// for each row, process each group one at a time so you can break the loop
async.eachSeries(eachRow, function(group, callback2) {
// stuff
});
// stuff
});
相关文章:
- 在forEach内部进行异步调用
- 使用从内部函数返回的异步数据对外部函数返回promise
- 循环内部的Javascript异步调用
- javascript对象内部的Ajax异步
- 递归函数内部的异步调用
- 在异步内部函数返回 [UI-路由器和 HTML 服务] 之后返回外部 fn
- Angularjs 测试控制器内部的异步行为
- 如何在节点 js 中打破内部异步循环
- 节点异步仅在 node-lambda 内部调用第一个函数
- 如何在内部异步函数完成运行后调用外部函数返回
- 从对象内部的异步回调内部调用函数
- Node.js中循环异步函数内部未定义的变量
- yeoman生成器:复制或模板dos'不能在异步回调内部工作
- Node.js:从内部有异步调用的函数返回值
- javascript中函数内部的变量?(使用异步调用)
- 如何使用生成器在内部循环带有try-catch块的异步代码
- 当内部函数异步执行某些操作时,如何从外部函数的回调返回值
- 如何在另一个异步`each`方法(NodeJS)内部进行异步方法调用
- 调用内部异步回调后迭代for循环
- 关于node.js内部异步I/O机制的困惑