2016-04-29 13 views
1

Ich arbeite in Knoten JavaScript und versuche, eine neue Funktion auszuführen, wenn eine vergangene Schleife abgeschlossen ist. Im folgenden Code wird // loop through objects in data, to process it verwendet, um die Basis für die Schleife durch die Daten darzustellen, wobei die Daten an ein Array angehängt werden.Ausführen einer Funktion, wenn eine Operation abgeschlossen ist

Mit jeder Antwort wird z um eins erhöht. Allerdings finde ich oft, dass z 40 erreicht, bevor die Daten manchmal verarbeitet wurden. Ich kann z nicht in die Schleife einfügen, da sich auf jeder Seite viele Objekte befinden.

Könnte jemand eine Methode vorschlagen, nur z zu erhöhen und zu überprüfen, dass es gleich 40 ist, nachdem die Schleife abgeschlossen ist?

+1

Das ist, was Sie bereits tun, vorausgesetzt, Ihre Schleife ist, wo Ihr Kommentar ist. Wenn Ihre Schleife einige asynchrone Tasks auslöst, haben diese Tasks nichts damit zu tun, dass der Loop abgeschlossen wird. – Paulpro

+1

Können Sie konkretere Details angeben? * "Die Daten wurden verarbeitet" *: Welche Daten? In welchem ​​Code? Wenn Ihr Problem mit der Verarbeitung von Daten zusammenhängt oder nicht, müssen Sie unbedingt den entsprechenden Code angeben. – trincot

+0

@trincot Die Daten, die von der HTTP-Anfrage empfangen werden, werden verarbeitet, aber dies ist oft der Fall, wenn die Bedingung "if (z == 40) {}" wahr zurückgibt. Ich möchte, dass die Bedingung "if (z == 40) {}" ausgeführt wird, nachdem die Daten in ein Array eingegeben/verarbeitet wurden. – GregW

Antwort

1

Ich stimme mit trincot überein, ich würde Sie bitten, ein bisschen genauer zu sein. Aber von dem, was ich sammle, könnten Sie versuchen, async.each() zu verwenden. http://justinklemm.com/node-js-async-tutorial/

Ich hoffe, das hilft.

0

Vergleichen Sie in der Schleife für jede Antwort die Anzahl der verarbeiteten Objekte mit der Gesamtzahl der Objekte in der Antwort. Erhöhen Sie z nur, wenn diese Anzahl erreicht wurde.

+0

Async ist dein Freund :) – kevingilbert100

0

Ich empfehle die Verwendung von async.timesSeries aus dem populären Async-Modul!

Link zu: „Kann jemand empfehlen, ein Verfahren zur Herstellung nur z erhöht und die Überprüfung auf 40 gleich ist, nachdem die Schleife beendet ist“ https://github.com/caolan/async#times

Beispielcode :)

// Required NPM Modules 
var async = require('async') 

// Run Async Times Series Function 
// Will execute 40 times then make the final callback 
async.timesSeries(40, asyncOperation, asyncTimesCallback) 


/** 
* This is the primary operation that will run 40 times 
* @param {Number} n - Sort of like the index so if its running 40 times and its the last time its running its gonna be 39 or 40 not sure you may have to test that 
* @param {Function} next - Callback function when operation is complete see async times docs or example in this code 
*/ 
function asyncOperation (n, next){ 

    var req = http.request(headers, function(response) { 
     response.on('error', function (e) { 
      return next(e, null) 
     }) 
     response.on('data', function (chunk) { 
      // 
     }) 
     response.on('end', function() { 
      // loop through objects in data, to process it 
      return next(null, 'some value?') 
     }) 
    }) 
    req.on('error', function(e) { 
     return next(e, null) 
    }) 
    req.end() 

} 


/** 
* This is run after the async operation is complete 
*/ 
function asyncTimesCallback (err, results) { 

    // Error Checking? 
    if(err) { 
     throw new Error(err) 
    } 

    // function to run wen operation is complete 
    newFunction(results['values'], results['totals']) 

} 


/** 
* New Function The Callback Function Calls 
*/ 
function newFunction(values, totals){ 

    console.log('Values', values) 
    console.log('Totals', totals) 

} 
Verwandte Themen