如何在节点 js 中打破内部异步循环

How to break inner async loop in node js

本文关键字:内部 异步 循环 节点 js      更新时间:2023-09-26

请参阅此代码,为什么内部循环没有中断。我想仅在内部循环条件满足时才推入新数组这应该会中断内部循环的迭代,但外部循环应该像往常一样迭代。

灵感来自

这是我的代码:

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
});