2015-04-21 10 views
5

Es gibt mehr als 2000 Objekte im Array rows, die verarbeitet werden müssen, aber Fehler erhalten Maximum Call Stack überschritten. Callback-Funktion manipulieren Datenbank. Ich habe versucht,Nodejs RangeError Maximum Callstack überschritten

SetTimeout

, die arbeitet zu verwenden, sondern macht die Ausführung langsam. Gibt es eine andere Methode, um es zu beheben?

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

Sie verwenden eine rekursive Funktion (eine, die sich selbst aufruft). Können Sie sich einen Weg vorstellen, die gleiche Verarbeitung ohne dieses Muster zu machen? – joews

+0

Rekursion oder Schleife für die Behandlung von Db-Operationen sind immer eine schlechte Idee. – Lewis

+0

Bitte schlagen Sie die beste Lösung vor. – Rohit

Antwort

0

Jemand hat diese Lösung gepostet, aber entfernt. Also poste ich wieder seine Lösung. Dank ihm.

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

      }); 
     }); 
    } 
Verwandte Themen