Node.js运行异步函数一个接一个地执行

4

我是一名新手,对JS/Node.js不太熟悉,如果我的问题不够明确,请多包涵。

基本上,如果我有两个异步函数,

async function init() {...}
async function main() {...}

如何确保在init()完成其异步请求后调用main()函数?
具体而言,我想利用模块https://www.npmjs.com/package/hot-import。在该模块的页面上,有一个示例代码:
async function main() {
  const MODULE_CODE_42 = 'module.exports = () => 42'
  const MODULE_CODE_17 = 'module.exports.default = () => 17'

  const MODULE_FILE = path.join(__dirname, 't.js')

  fs.writeFileSync(MODULE_FILE, MODULE_CODE_42)
  const hotMod = await hotImport(MODULE_FILE)
  . . .

样例代码本身可以正常工作,但是当我将其放入事件回调函数中时,问题开始出现——它可以在第一次事件触发时工作,但在第二次时却无法正常运行。
我认为问题不在于常量hotMod,而是async函数中的await hotImport引起了问题。因此,我尝试将hotMod定义为全局变量,并在main()被调用之前的async init()函数中执行hotMod = await hotImport(MODULE_FILE)。但是,由于我对JS/nodejs还很陌生,迄今为止我还没有做到这一点。
请帮忙解决,谢谢。

不,我认为创建一个全局的 promise 变量并不能解决任何问题。你也不是在多次调用 main,对吧?请更详细地告诉我们当你将某些内容放入事件处理程序时具体会遇到什么问题,并发布一个带有未工作代码的 [mcve]。 - Bergi
@Bergi,没错,我完全同意。然而,我正在编写的程序是为https://github.com/Chatie/wechaty编写的,我可以提供一个最小的示例,但它依赖于大量的模块,而且我不太了解nodejs,无法用最简单的方式给出另一个事件触发示例。我确实感到,创建一个全局promise变量并不能帮助任何事情。这就是我的困境。 - xpt
你需要向我们展示相关的代码,以说明出现问题的情况,描述你想要发生什么以及观察到与之不同的情况。目前看来,你只是展示了一部分代码。而且,你可能需要展示hotImport()的代码,因为如果它没有返回一个与完成时间相关联的promise,那么await将无法实现你想要的效果。 - jfriend00
3个回答

7

使用异步等待

async function myFlow(){
.....
await init();
main();
....
}

在上述代码中,只有在解析 init() 后才会调用 main()。 希望这能对你有所帮助。

非常感谢Varun的逻辑思维和仔细阅读我的问题,并给出了直戳本质的答案!BINGO!对于像我的原始问题这样简单的问题,这是一个绝妙的简单 回答。谢谢! - xpt
这真的帮了我很多。谢谢! - doriansm

6

异步函数返回的是Promise。因此,您应该能够使用then()一个接一个地调用它们。

init()
.then(() => main())

如果init返回了某个值(例如hotMod),你可以将其作为参数传递给then的回调函数。
init()
.then((init_return) => {
   // do something with init_return
   return  main()
})

4
更简洁地说:init.then(main) - Bergi
毫无疑问,@Bergi -- 只是为了明确连接,以防init()返回值。 - Mark

2

如果要同步运行它们,只需执行以下操作:

await init()
await main()

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