使用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) { });
希望这个帮助。
- nodejs循环async.parallelcallback
- async.js并行工作不正常
- Node + Sequelize:如何在添加之前检查项目是否存在? (asynchronous混淆)
- 有关node.js中的async.waterfall的问题
- 错误:callback已被调用 – asynchronousnode.js oracledb
- 我可以指定如何处理asynchronousJavaScript库中的错误?
- Async函数嵌套在async.js瀑布中
- 使用Node.js,Async和Formidable进行error handling
- Nodejsasynchronous编程 – 为什么需要“asynchronous”模块? 什么是“回拨地狱”/“厄运金字塔”?