节点在继续之前等待异步功能
Posted
技术标签:
【中文标题】节点在继续之前等待异步功能【英文标题】:Node wait for async function before continue 【发布时间】:2018-04-19 22:00:01 【问题描述】:我有一个使用一些异步函数的节点应用程序。
在继续应用程序流程的其余部分之前,我该如何等待异步函数完成?
下面是一个简单的例子。
var a = 0;
var b = 1;
a = a + b;
// this async function requires at least 30 sec
myAsyncFunction(, function(data, err)
a = 5;
);
// TODO wait for async function
console.log(a); // it must be 5 and not 1
return a;
在示例中,要返回的元素“a
”必须是 5 而不是 1。如果应用程序不等待异步函数,则它等于 1。
谢谢
【问题讨论】:
伟大而有用的评论 是的,promise 和async
/await
语法糖——正如你在标签中建议的那样——是要走的路。您是否尝试将它们应用于您的问题?请展示你的努力。
How to return the response from an asynchronous call?的可能重复
【参考方案1】:
使用回调机制:
function operation(callback)
var a = 0;
var b = 1;
a = a + b;
a = 5;
// may be a heavy db call or http request?
// do not return any data, use callback mechanism
callback(a)
operation(function(a /* a is passed using callback */)
console.log(a); // a is 5
)
使用异步等待
async function operation()
return new Promise(function(resolve, reject)
var a = 0;
var b = 1;
a = a + b;
a = 5;
// may be a heavy db call or http request?
resolve(a) // successfully fill promise
)
async function app()
var a = await operation() // a is 5
app()
【讨论】:
我一直在寻找关于Promise的一个很好的解释,终于找到了!谢谢! 这两种选择实际上都没有等待。特别是await
返回的a
不是5。相反,它是一个promise,这只是需要回调的另一种方式。正确的答案是:你等不及了。
操作函数之前不需要异步,因为它不使用等待。它是多余的,因为异步使得函数返回一个承诺,但 operation() 已经返回一个承诺。以上是关于节点在继续之前等待异步功能的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JS(节点)中使用回调来等待 Async 函数完成后再继续?