2016-07-21 15 views
1

Ich muss durch ein bestimmtes JSON-Objekt durchlaufen und erstellen Sie eine Aufgabe für jedes Objekt in dort. Die angegebenen Aufgaben benötigen ebenfalls Informationen von diesem JSON-Objekt und ich frage mich, wie ich diese Informationen an meine Aufgabe weitergeben kann, damit sie bei der Ausführung verfügbar sind.Übergeben Sie Parameter an async.js Aufgabe

meine Aufgabe Array Aufbau:

var asyncScrapeTasks = []; 
var resources = JSON.parse(body); 
for(var i=0; i<resources.items.length; i++) 
{ 
    asyncScrapeTasks.push(function (callback) 
    { 
     console.log(resources.items[i].id); 
    }); 
} 

meine Aufgaben durchführen:

async.parallelLimit(asyncScrapeTasks, 5, function() { 
    callback(null, "Done"); 
}); 

Mein Problem:

Gerade jetzt console.log(resources.items[i].id); kehrt undefiniert, die Sinn macht ich, weil th Der Index i ist zu dem Zeitpunkt, zu dem die Funktionen ausgeführt werden, nicht bekannt, aber ich frage mich, wie ich mein Problem lösen kann.

+0

Ihr Code Art unvollständig ist, da console.log keine Asynchron-Funktion ist. Können Sie ein konkreteres Beispiel dafür geben, was Sie vorhaben? – slebetman

+0

@slebetman ja ich habe versucht, es so viel wie möglich zu vereinfachen. Im Grunde möchte ich ein Json-Objekt von einer externen URL erhalten und spezifische Informationen aus dieser JSON-Datei abrufen, um es in meiner eigenen Datenbank zu speichern. – kentor

+0

Aber Ihr Kommentar 'weil Ressourcen zu dem Zeitpunkt, an dem die Funktionen ausgeführt werden, noch nicht bekannt sind' ergibt am Beispiel keinen Sinn. Wenn das wirklich passiert, dann ist das Beispiel, das du gepostet hast, das falsche (du hast es so sehr vereinfacht, dass du das Problem vollständig beseitigst) – slebetman

Antwort

2

Da ich nicht genug Ruf habe, um einen Kommentar hinzuzufügen, schreibe ich als Antwort. Es tut uns leid.

Gibt es einen bestimmten Grund für die Verwendung von paralleLimit? async.js haben jeweils die Möglichkeit, die Auflistung zu iterieren und Operationen für jedes Element auszuführen. Diese Funktion wendet die Funktion iteratee parallel auf jedes Objekt in der Sammlung an. async.js each

Wenn Sie die Operationen einschränken möchten: async.js eachLimit

+0

Ich bin nicht 100% überzeugt, dass ich den Hauptunterschied zwischen jedem und Parallelen habe? Ich habe gerade gelesen, dass Parallele I/O-Aufgaben parallel startet, was genau das ist, was ich tue, da ich Informationen über einen URL-Aufruf an einen externen Webserver anfordere. Ich denke, Ihr Punkt ist, dass ich auf resource.items.eachLimit direkt iterieren könnte, ist das korrekt? Ich bin neu in async.js – kentor

+0

Ja, Sie können eachLimit verwenden, iteratee können Sie Ihre Ruhe API anrufen. [asyc.js Documentation] (http://caolan.github.io/async/docs.html#) hat einen anderen Geschmack beschrieben und auch den Link der Quelle unter jedem Beispiel bereitgestellt. –