2016-03-04 3 views
0

, пожалуйста, смотрите этот код, почему внутренний цикл не прерывается. Я хочу вставить новый массив только в том случае, если внутреннее условие цикла удовлетворяет , и это должно сломать итерацию внутреннего цикла, но внешний цикл должен повторяться как обычно.Как разбить внутреннюю асинхронную петлю в узле js

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

ответ

0

Вместо кода:

return callback2(fakeErr); 

Вы меняете к:

callback2(fakeErr); 
return; 

И вы должны вернуться сюда, если нет, то ваша программа получает два обратных вызов

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

callback(null, filteredRows); 
0

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