gpt4 book ai didi

node.js - NodeJS在异步函数之间传值

转载 作者:搜寻专家 更新时间:2023-11-01 00:16:46 26 4
gpt4 key购买 nike

我需要做的最简化的版本如下:

1) Two asynchronous functions (one-after-another) within a global function.

2) Child Function1 generates a value.

3) Child Function2 can use the above value.

这是一个简化的示例代码:

someFunction = function(data) {
async.series([

function(callback) {
firstFunction = function() {
NUMBER = value;
}
callback();
},

function (callback) {
secondFunction = function() {
newNumber = NUMBER;
}
callback();
}
]);
};

解决方案可以是回调、异步、 promise 或其他任何方式。我尝试了其中的大部分,但都没有给我第二个函数中的值。 :/

最佳答案

基础知识

最简单的解决方案是简单地将 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
});
});

注意上面使用的技巧。您始终可以通过将任何函数包装在另一个函数中来将任何函数按摩到要传递给任何函数的预期原型(prototype)。这里 firstFunction 期望它的回调看起来像

function (number) {}

但是secondFunction实际上是

function (number,callback) {}

所以我们将 secondFunction 包装在一个匿名函数中,以允许将其传递给 firstFunction。要将这两个函数包装到另一个更高级别的函数中,您只需执行以下操作:

function higerLevelFunction (callback) {
firstFunction(function(passing_number_here){
secondFunction(passing_number_here, callback); // <-- note
});
}

注意:将回调从 higherLevelFunction 传递到 secondFunction 的目的是允许调用 higherLevelFunction 的人等待进程完成。

另请注意,为异步回调返回值的正确方法是将其传递给回调。

使用异步.js

如果您使用 async.js,则可以使用 async.waterfall 来执行此操作。文档指出:

Runs the tasks array of functions in series, each passing their results to the next in the array.

听起来正是您所要求的:

async.waterfall([
firstFunction,
secondFunction
], function () {
// done
});

使用 promise

关于如何将回调转换为 promise 的示例和教程有很多,因此我不打算在这里展示。但是一旦你有了一个 promise 传递值看起来就干净多了:

function firstFunction () {
return something_returning_a_promise();
}

function secondFunction (number) {
// I have number!!

return another_promise;
}

firstFunction()
.then(secondFunction)
.then(function(){
// done
});

异步/等待

如果你有返回 Promises 的函数,你可以在 async 函数中await它们:

async function () {
let number = await firstFunction();
secondFunction(number);
}

或者甚至简单地:

async function () {
secondFunction(await firstFunction());
}

关于node.js - NodeJS在异步函数之间传值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44711885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com