使用async.waterfall

我正在使用node.js和asynchronous包。

这是我有的代码:

async.waterfall( [ function(callback) { var data = getSomeData(); callback(null, data); }, function(data, callback) { someFunctionThatNeedsData(data); callback(null, 'done'); } ], function(err, result) { } ); 

getSomeData具有一个asynchronousHTTP请求,用于从Web服务获取一些数据。 我想等待,直到我得到一个响应,然后返回该数据,并将其传递给一些someFunctionThatNeedsData

我期望的是getSomeData – 包括其内部的callback – 将不得不完成,然后再调用someFunctionThatNeedsData

问题在于,尽pipe在这里使用了waterfall函数,但data到达someFunctionThatNeedsData函数所需要的data还是未定义的。

另外,从console.log我可以看到getSomeData的结束是在getSomeData内部的callback甚至开始之前达到的。

我错误地使用了waterfall ,还是这里不是正确的工具? 如果它不对,我可以用什么来达到预期的效果?

或者我必须辞职,以深嵌套callback(未来的工作,我会),并不得不通过提取内联代码到命名函数缓解它?

getSomeData()具有一个asynchronoushttp请求,它从Web服务中获取一些数据。

这是问题。 执行stream程已经继续callback并执行。 这就是asynchronous函数的工作方式!

您必须将callback传递给getSomeData ,一旦HTTP请求完成,就会调用它。 所以是的:你可能需要嵌套callback。

如果你有asynchronous操作。 你不需要使用async.waterfall。 你可以用承诺链的方式做到这一点。

 getSomeData().then(function(data) { var changeData = changeYourData(data); return changeData; }).then(function(changedData) { // some more stuff with it. You can keep on forwarding to the next `then` }).catch(function(err) { // if any error throw at any point will get catch here }).finally(function() { // this one will guarantee get call no matter what, // exactly the same like async.waterfall end of chain callback }); 

这个例子将与Q , When和遵循标准的任何promise lib一起工作。

如果你需要使用async.waterfall(因为你可以用Array.map来驱动它)你只需要在你的callback

 async.waterfall( [ function(callback) { // A getSomeData().then(function(data) { callback(null, data); }); // B - just throw the whole thing in callback(null , getSomeData()); }, function(data, callback) { // A someFunctionThatNeedsData(data); // B data.then(function(resolvedData) { someFunctionThatNeedsData(resolvedData); callback(null, 'done'); }); } ], function(err, result) { }); 

希望这个帮助。