如果我们不等待异步 JavaScript 函数会发生什么?

3

如果我们不等待异步JavaScript函数会发生什么?

据我所知,像C#这样的语言不应该未经管理地运行异步函数!

我想知道JavaScript语言是否也是如此?

var asynchronousFunction = async function() {
    //...
}

function main() {
   var result = true;
   //...
   asynchronousFunction(); // The result of this function has no effect on our output (result)
   //...
   return result;
}

3
很遗憾,JS并不会“管理”异步函数,因此它们只是运行并返回一个Promise。如果你忽略了这个Promise,那就是你的问题,而且拒绝会未被处理。 - Bergi
2个回答

5

它的运行方式完全一样。(实际上,你永远不会"await"一个函数,而是等待它返回的"Promise")

异步函数在执行时是同步进行的,直到其中第一个"await"或"return"语句,此时将向调用方返回一个"Promise"对象,并安排剩余部分稍后再次运行。

由调用方来处理这个"Promise",可以对其进行操作(或不做任何操作)。毕竟,您可能希望将"Promise"存储在数组中并等待所有的"Promise"完成(使用"Promise.all"),或者对其进行更高级的操作,因此JavaScript本身并不关心。

但是,一些智能的IDE和代码检查工具可以警告未处理的"Promise",特别是如果有足够的类型信息可以进行警告(例如使用TypeScript)。


1

同样适用于JavaScript。

如果只是创建一个Promise并完全不处理它,那么如果出现错误,它们将成为未处理的错误,如果意外退出,则无法知道。

我建议在顶层使用Promise.race,然后它将并行运行所有异步函数,但如果其中任何一个意外退出,它将退出。

async function worker() {
  while (true) {
    // do background work in a loop
  }
}

async function server() {
  await init()
  await listen()
}

function main() {
  const p0 = worker()
  const p1 = server()

  try {
    await Promise.race([p0, p1])
    console.log('done')
    return true
  } catch (err) {
    console.log('The server had an error unexpectedly', err)
    return false
  }
}

如果您希望承诺最终能够优雅地退出,则请使用Promise.all,它将等待所有承诺成功退出后再解决。

Promise.race不会取消其他的promise。在Node中,你需要在那个点上显式地退出进程(或以其他方式信号其他的promise停止)。 - AKX
没错,你需要传递取消令牌和/或调用 process.exit() - justin.m.chase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接