2016-05-16 5 views
0

Obwohl ich jetzt konnte ich eine Variable außerhalb der Funktionen zu Microsite oder ändern Sie den Rückruf auf der 2. Funktion zu function(err, result) { cb(cb, result, microsite)} Ich möchte eine bessere Option als die oben vorgeschlagenen wissen. Hier ist mein Code:Was ist eine bessere Möglichkeit, das Ergebnis der asynchronen 1. Funktion der 3. Funktion zu erhalten?

var funcs = [ 
    function(cb){ 
    Microsite.findOne({_id: id1}, cb); 
    }, 
    function(microsite, cb){ 
    VideoAccount.findOne({_id: id2}, cb); 
    }, 
    function(videoAccount, cb) { 
    execute(microsite, videoAccount, cb); 
    }); 

    async.waterfall(funcs, function(err, result){...}); 
+0

Ich denke du solltest einen Blick hier werfen: http://stackoverflow.com/questions/15420019/asyncjs-bypass-a-funktion-in-a-wasserfall-chain und auch hier: https://github.com/caolan/async/issues/11 –

Antwort

1

Sie die auto Funktion verwenden können:

async.auto({ 

    microSite: function(cb) { 
     Microsite.findOne({_id: id1}, cb); 
    }, 

    videoAccount: function(cb) { 
     VideoAccount.findOne({_id: id2}, cb); 
    }, 

    thirdFunction: ["microSite", "videoAccount", function(results, cb) { 
     execute(results.microSite, results.videoAccount, cb); 
    }] 

}, function(error, result) {...}); 

wo die endgültige result ist eine Aufgabe der Form:

result = { 
    microSite, 
    videoAccount, 
    thirdFunction 
} 

HINWEIS: die Parameter in der dritten Funktion sind abhängig von Ihrer Version:

1.x ist function(cb, results)

2.x function(results, cb)

persönlich ist, dass ich Auto benutzen überall statt parallel, Wasserfall, und Serien. Es erleichtert das Refactoring in der Zukunft, wenn sich Ihr Code jemals an Ihren aktuellen Bedarf ändert.

+0

Die automatische Methode ist großartig. Vielen Dank! – samura

Verwandte Themen