2013-03-29 10 views
5

Ich bin ein Begginer in node.js und jetzt versuche ich, einige API-Ergebnisse zu bekommen. Ich verwende Async-Modul (https://github.com/caolan/async), um die Anfrage parallel zu gestalten, damit sie optimiert werden kann.Async-Modul Fehler mit parallelen API-Anfragen

Das Problem ist der Code einen Fehler zurückgibt, die bei jeder Punkte auf einer anderen Zeile (die "Rückruf (err, data)" line) in einer anderen API-Aufruf

Das ist, ist der Fehler:

if (called) throw new Error("Callback was already called."); 
         ^
Error: Callback was already called. 

ich die folgende Funktion bin mit der API zu beantragen:

function getData(s, apiURL, getURL, callback) { 

    var ht; 
    if (s == 1) { 
     ht = https; 
    } else { 
     ht = http; 
    } 

    var options = { 
     hostname : apiURL, 
     path : getURL, 
     method : 'GET' 
    } 

    var content = ""; 

    ht.get(options, function(res) { 
     console.log("Got response: " + res.statusCode); 

     res.on("data", function(chunk) { 

      content += chunk; 
      //console.log(content); 
      callback(content); 
     }); 

    }).on('error', function(e) { 
     console.log("Error: " + e.message); 
     console.log(e.stack); 
    }); 
} 

zur Veranschaulichung dieses ist, wie ich das Asynchron-Modul bin mit:

var sources = sources.split(',') 

    async.parallel({ 
     flickr : function(callback) { 
      if (sources[0] == 1) { 
       getData(0, 'api.flickr.com', 
       "/services/rest/?method=flickr.photos.search&format=json&nojsoncallback=1&api_key=" + config.flickr.appid + "&per_page=5&tags=" + tags, 

       function(data) { 
        callback(null, data); //here that the error may point 
       }); 

      } else { callback(); } 
     }, 
     instagram : function(callback) { 
      if (sources[1] == 1) { 

       getData(1, 'api.instagram.com', 
       "/v1/tags/" + tags.split(',')[0] + "/media/recent?client_id=" + config.instagram, 
       function(data) {       
        callback(null, data); //here that the error may point 

       }); 
      } else { callback(); } 
     } 
    }, function(err, results) {    
      console.log(results); 
     }); 

Hoffe, du kannst mir helfen, danke!

Antwort

12

Sie rufen die Rückruffunktion innerhalb des data-Ereignisses (see the docs) auf, das jedes Mal ausgelöst wird, wenn ein Datenblock empfangen wird, dh mehrere Male.

Async.parallel erwartet, dass der Rückruf nur einmal für jede Aufgabe ausgeführt wird.

Um nur einen Callback pro Task sicherzustellen, setzen Sie den Callback beispielsweise auf ein Ereignis end.

Auch das Fehlerereignis sollte den Rückruf ebenfalls ausführen.

Verwandte Themen