2015-04-21 4 views
5

В массиве строк есть более 2000 объектов, которые необходимо обработать, но получить ошибку. Максимальный уровень стека вызовов. Функция обратного вызова управляет базой данных. Я пытался использоватьNodejs RangeError Максимальный стек вызовов превышен

SetTimeout

, который работает, но делает выполнение медленно. Есть ли другой способ его исправить.

var updateRowsStatus = function (req, rows, next) { 

    if (rows.length == 0) { 
     return next(); 
    } 

    var batchRows = rows.splice(0, 20); 
    var count = 0; 


    batchRows.forEach(function (row) { 

     // other function 

     updateSubEntity(req, row, 'rows', function (err, response) { 
      if (err)throw err; 

      if (++count == batchRows.length) { 

       updateRowsStatus(req, rows, next); 

      } 
     }); 
    }); 
}; 
+2

Вы используете рекурсивную функцию (вызывающую себя). Можете ли вы придумать способ сделать такую ​​же обработку без этого шаблона? – joews

+0

Рекурсия или цикл для обработки операций с db - это всегда плохая идея. – Lewis

+0

Пожалуйста, предложите лучшее решение. – Rohit

ответ

0

Кто-то разместил это решение, но удален. Поэтому я снова отправляю его решение. Спасибо ему.

var count = 0; 
    var length = rows.length; 

    while (rows.length > 0) { 

     console.log('rows -', rows.length); 

     var batchRows = rows.splice(0, 20); 

     batchRows.forEach(function (row) { 
      updateSubEntity(req, row, 'rows', function (err, response) { 
       if (err)throw err; 

       if (++count == length) { 

        return next(); 
       } 

      }); 
     }); 
    } 
Смежные вопросы