【问题标题】: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 语法糖——正如你在标签中建议的那样——是要走的路。您是否尝试将它们应用于您的问题?请展示你的努力。

标签: javascript node.js asynchronous promise async-await


【解决方案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() 已经返回一个承诺。
猜你喜欢
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
相关资源
最近更新 更多