2016-04-05 9 views
0

Ich möchte einen async-Aufruf von meiner getData-Funktion zur getImage-Funktion ausführen, aber ich kann keine Daten von getImage() abrufen, da getData() nicht auf den Abschluss von getImage() wartet. , da getImage() weitere asynchrone db-Aufrufe hat und daher getData() immer undefiniert zurückgibt.Knoten js verschachtelter Async-Aufruf

Was ist der beste Weg dies zu tun, stattdessen verschachtelte Callbacks zu tun?

var getData = function(id){ 
async.series([    
     function(callback){      
        var res = getImages(id);                  
        callback(null, res);           
     } 
    ], 
    // optional callback 
    function(err, results){ 

    if (err) {      
     console.log("ERROR : " + err); 
     }else 
     {   
       console.log("Result: "+results);    
     } 
    }); 

} 



var getImages = function(id){ 

    async.series([    
     function(callback){ 
       Image.find({id: id }).exec(     
        function(err, image) { 
        if (err) { 
         console.log(err);         
         callback(err, 0); 
         }else 
         {  console.log("Count: "+ image.length);                  
          callback(null, image);            
         } 
       });       
     } 
    ], 
    // optional callback 
    function(err, results){ 

    if (err) {      
     console.log("ERROR : " + err); 
     }else 
     {         

       return results;   

     } 
    }); 

} 


getData(1); 

Antwort

2

Wie Sie sagten, müssen Sie auf getImages() warten, um zurückzukehren, und Sie tun das mit Versprechen. jede Versprechung Bibliothek verwenden, wie zum Beispiel q:

getImages(id).then(
    function(res) { 
    callback(null, res); 
    }, 
    function(err) { 
    console.log("error:" + err); 
    } 
); 
+0

Thanks @ buddy123:

var q = require('q') ... var getImages = function(id){ var deferred = q.defer(); ... //do async logic that that evaluates some res obj you wish to return db.find(..., function() { deferred.resolve(res); } return deferred.promise; } 

Dann von getData(), können Sie es in der folgenden Materie nennen. –

0

Wie Sie async nutzen bereits - nur die waterfall Funktionalität nutzen: https://github.com/caolan/async#waterfalltasks-callback

Auf diese Weise können Funktionen nacheinander ausgeführt werden können, und für die vorherige warten, zu beenden, während es immer noch die Rückkehr bekommen Wert.