【问题标题】:How to break inner async loop in node js如何打破节点js中的内部异步循环
【发布时间】:2016-06-17 23:08:44
【问题描述】:

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

Inspired from

这是我的代码:

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' }                                      
                            ];

【问题讨论】:

    标签: javascript node.js asynchronous


    【解决方案1】:

    代替你的代码:

    return callback2(fakeErr);
    

    你改为:

    callback2(fakeErr);
    return;
    

    你应该在这里返回,如果没有,你的程序会收到两个回调

    if (err)
        callback(err, null);
        // return here
        return;
    
    callback(null, filteredRows);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-11
        • 1970-01-01
        • 2014-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多