我需要做的最简单的事情是:
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());
}

07-24 09:43
查看更多