我使用的是node.js和异步包。
下面是我的代码:
async.waterfall(
[
function(callback) {
var data = getSomeData();
callback(null, data);
},
function(data, callback) {
someFunctionThatNeedsData(data);
callback(null, 'done');
}
],
function(err, result) {
}
);getSomeData有一个异步HTTP请求,可以从web服务获取一些数据。我想等到得到响应,然后返回数据并将其传递给someFunctionThatNeedsData。
我所期望的是,getSomeData --包括其中的回调--必须在继续调用someFunctionThatNeedsData之前完成。
问题是,尽管在这里使用了waterfall函数,但data在到达someFunctionThatNeedsData时仍未定义。
此外,从console.log中我可以看到,getSomeData的末尾甚至在getSomeData内部的回调开始之前就到达了。
我是不正确地使用waterfall,还是这里不是正确的工具?如果这是不对的,我可以用什么来达到预期的效果?
还是我必须接受深度嵌套的回调(在以后的工作中,我会这样做),并且必须通过将内联代码提取到命名函数中来减轻它?
发布于 2014-03-15 02:29:38
getSomeData()有一个异步http请求,它从web服务中获取一些数据。
这就是问题所在。执行流已经继续到回调并执行它。这就是异步函数的工作方式!
您必须将回调传递给getSomeData,它在HTTP请求完成后调用它。所以,是的:你可能需要嵌套回调。
发布于 2015-10-24 07:12:46
如果您有异步操作。您不需要使用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
});如果您需要使用async.waterfall (因为您可以使用Array.map驱动它),则只需在then中回调即可
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) {
});希望能帮上忙。
https://stackoverflow.com/questions/22418790
复制相似问题