2016-05-16 29 views
0

虽然我现在可以在funcs之外获得一个变量来作为微型网站,或者将第二个函数的回调更改为function(err, result) { cb(cb, result, microsite)},但我想知道比上面提到的更好的选项。这里是我的代码:从第三个函数的异步第一个函数中获取结果的更好方法是什么?

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

我想你应该看看这里:http://stackoverflow.com/questions/15420019/asyncjs-bypass-a-function-in-a-waterfall-chain也在这里:https://github.com/caolan/async/issues/11 –

回答

1

可以使用auto功能:

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) {...}); 

,其中最终result是形式的对象:

result = { 
    microSite, 
    videoAccount, 
    thirdFunction 
} 

注意:参数在第三个功能取决于您的版本:

1.x的是function(cb, results)

2.X是function(results, cb)

就个人而言,我是平行,瀑布,以及一系列使用自动随处可见。如果您的代码改变为您当前的需求,它将使未来重构更容易。

+0

自动方法非常棒。谢谢! – samura

相关问题