2012-06-16 7 views
7

Ich versuche Async zu verwenden und Modul zusammen anfragen, aber ich verstehe nicht, wie die Rückrufe übergeben werden. Mein Code istVerwenden von Nodejs async und Request-Modul

Ich versuche, 3 Dateien in Reihenfolge zu holen und die Ergebnisse zu verketten. Mein Kopf steckt in Rückrufen, die ich versucht habe, und den verschiedenen Kombinationen, die mir einfielen. Google war nicht viel Hilfe.

Antwort

32

Anfrage ist asynchrone Funktion, es gibt nichts zurück, wenn seine Arbeit erledigt ist, ruft es zurück. Von request examples, sollten Sie so etwas wie tun:

var fetch = function(file,cb){ 
    request.get(file, function(err,response,body){ 
      if (err){ 
       cb(err); 
      } else { 
       cb(null, body); // First param indicates error, null=> no error 
      } 
    }); 
} 
async.map(["file1", "file2", "file3"], fetch, function(err, results){ 
    if (err){ 
     // either file1, file2 or file3 has raised an error, so you should not use results and handle the error 
    } else { 
     // results[0] -> "file1" body 
     // results[1] -> "file2" body 
     // results[2] -> "file3" body 
    } 
}); 
+1

Code arbeiten und sehr einfach zu verstehen, was ich falsch gemacht habe jetzt :) Dank – andrei

+0

Ihr Link zu den Beispielen zeigt keine Rückrufe. Sie melden sich nur an der Konsole an. – Catfish

3

In Ihrem Beispiel die fetch Funktion wird dreimal aufgerufen werden, einmal für jeden der Dateinamen in dem Array als erste Parameter zu async.map geben. Ein zweiter Callback-Parameter wird ebenfalls an fetch übergeben, aber dieser Callback wird vom async-Framework bereitgestellt und Sie müssen ihn aufrufen, wenn Ihre fetch-Funktion ihre Arbeit abgeschlossen hat und die Ergebnisse diesem Callback als zweiten Parameter bereitgestellt werden. Der Rückruf, den Sie als dritten Parameter für async.map bereitstellen, wird aufgerufen, wenn alle drei Anrufe fetch den ihnen zugewiesenen Rückruf aufgerufen haben.

Sehen https://github.com/caolan/async#map

So Ihre spezielle Frage im Code zu beantworten, die Callback-Funktion, die Sie zur Verfügung stellen wird als Rückruf ausgeführt bei dann allen Anfragen zu beenden. Wenn Sie einen Rückruf an fetch passieren bräuchten Sie so etwas tun:

async.map([['file1', 'file2', 'file3'], function(value, callback) { 
    fetch(value, <your result processing callback goes here>); 
}, ...