nodejs一个接一个地运行异步函数

xpt*_*xpt 2 javascript node.js promise async-await

我是 JS/nodejs 的新手,所以如果我不能提出切中要害的问题,请原谅我。

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

async function init() {...}
async function main() {...}
Run Code Online (Sandbox Code Playgroud)

如何确保在 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)
  . . .
Run Code Online (Sandbox Code Playgroud)

示例代码按原样工作,但是当我将其放入事件回调函数时,事情开始出现问题——它适用于第一个事件触发器,但不适用于第二个。

我认为问题不是 constant hotMod,而是导致问题的异步函数中的await hotImport 。因此,我试图定义为全局变量并在调用之前在函数中执行。但到目前为止我还没有,因为我对 JS/nodejs 还很陌生。hotModhotMod = await hotImport(MODULE_FILE)async init() main()

请帮忙。谢谢。

Var*_*eja 7

使用 aysnc 等待

async function myFlow(){
.....
await init();
main();
....
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,只有在 init 被解析()时才会调用 main()。我希望这可以帮助你。


Mar*_*yer 5

异步函数返回承诺。所以你应该能够一个接一个地调用then()

init()
.then(() => main())
Run Code Online (Sandbox Code Playgroud)

如果init返回某些内容(例如hotMod),您可以将其作为 then 回调的参数。

init()
.then((init_return) => {
   // do something with init_return
   return  main()
})
Run Code Online (Sandbox Code Playgroud)

  • 更简单:`init.then(main)` (4认同)