【问题标题】:nodejs run async function one after anothernodejs一个接一个地运行异步函数
【发布时间】:2019-05-22 18:14:45
【问题描述】:

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

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

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 定义为全局变量,并在async init() 函数之前 调用main() 中执行hotMod = await hotImport(MODULE_FILE)。但到目前为止我还不能,因为我对 JS/nodejs 很陌生。

请帮忙。谢谢。

【问题讨论】:

  • 不,我认为创建一个全局 promise 变量不会有任何帮助。无论如何,您不会多次致电main,对吗?请告诉我们更多关于当您将某些内容放入事件处理程序时究竟发生了什么分裂的信息,并发布带有无效代码的minimal reproducible example
  • @Bergi,真的,我完全同意。但是,我正在编写的程序是为github.com/Chatie/wechaty 编写的,我可以为此举一个最小的例子,但这取决于大量的模块,而且我不知道 nodejs 足够好,无法给出另一个事件触发示例最小的方式。我确实觉得制作一个全局承诺变量不会有任何帮助。这是我的困境。
  • 您需要向我们展示不适用的情况的相关代码,描述您想要发生的情况并描述您观察到的与此不同的情况。现在,看起来你只是在向我们展示一件作品。而且,您可能需要显示hotImport() 的代码,因为如果它没有返回与完成时间相关的承诺,那么await 将不会做您想做的事情。

标签: javascript node.js promise async-await


【解决方案1】:

要同步运行它们,只需:

await init()
await main()

【讨论】:

    【解决方案2】:

    使用aysnc等待

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

    在上面的代码中,main() 只会在 init 被 resolve() 时被调用。 希望对您有所帮助。

    【讨论】:

    • 非常感谢 Varun 进行逻辑思考并通过我正在尝试提出的问题并给出中肯的答案钉子就在它的头上!!!答对了!对于像我的 OP 这样的简单问题,出色的 simple 答案。谢谢!
    • 这对我很有帮助。谢谢!
    【解决方案3】:

    异步函数返回承诺。所以你应该可以用then()一个接一个地打电话

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

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

    init()
    .then((init_return) => {
       // do something with init_return
       return  main()
    })
    

    【讨论】:

    • 更简单:init.then(main)
    • 毫无疑问,@Bergi——只是试图建立显式连接,以防init()有返回值
    猜你喜欢
    • 2022-11-22
    • 2021-04-30
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多