我需要做的最简单的事情是:
1)全局函数中的两个异步函数(一个接一个)。
2)子函数1生成一个值。
3)子函数2可以使用上述值。
下面是一个简化的示例代码:
someFunction = function(data) {
async.series([
function(callback) {
firstFunction = function() {
NUMBER = value;
}
callback();
},
function (callback) {
secondFunction = function() {
newNumber = NUMBER;
}
callback();
}
]);
};
解决方案可以是回调、异步、承诺或其他。我试了大部分,但都没有给出第二个函数的值。:。/
最佳答案
基础知识
最简单的解决方案是简单地将secondFunction
作为回调传递给firstFunction
:
function firstFunction (callback) {
do_something_async(callback(NUMBER){
callback(NUMBER);
})
}
function secondFunction (number, callback) {
// I have number!!
}
firstFunction(function(passing_number_here){
secondFunction(passing_number_here, function(){
// done
});
});
注意上面使用的技巧。您始终可以通过将任何函数包装到另一个函数中,将其传递到任何函数的预期原型中。这里
firstFunction
希望它的回调看起来像function (number) {}
但实际上
function (number,callback) {}
因此,我们将
secondFunction
包装在一个匿名函数中,以允许它被传递给secondFunction
。要将这两个函数包装成另一个更高级别的函数,只需执行以下操作:function higerLevelFunction (callback) {
firstFunction(function(passing_number_here){
secondFunction(passing_number_here, callback); // <-- note
});
}
注意:将回调从
firstFunction
传递到higherLevelFunction
的目的是允许调用secondFunction
的人等待进程完成。还要注意,返回异步回调值的正确方法是将其传递给回调。
使用async.js
如果使用async.js,则可以使用
higherLevelFunction
来执行此操作。文件规定:依次运行函数的tasks数组,每个函数将其结果传递给数组中的下一个函数。
听起来正是你想要的:
async.waterfall([
firstFunction,
secondFunction
], function () {
// done
});
使用承诺
关于如何将回调转换为承诺,有很多示例和教程,所以我不在这里展示。但一旦你有了承诺,传递价值观就会变得更加清晰:
function firstFunction () {
return something_returning_a_promise();
}
function secondFunction (number) {
// I have number!!
return another_promise;
}
firstFunction()
.then(secondFunction)
.then(function(){
// done
});
异步/等待
如果您有返回承诺的函数,则可以在
async.waterfall
函数中await
它们:async function () {
let number = await firstFunction();
secondFunction(number);
}
或者干脆:
async function () {
secondFunction(await firstFunction());
}