You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS中如何让async函数执行完毕后再调用后续函数?

问题分析

你遇到的核心问题是:func 虽然标记为 async,但它内部的 setInterval 是独立的异步操作,且函数本身没有等待这个操作完成就直接返回了。await func() 本质上是等待一个立即resolve的Promise(async函数若未显式返回Promise,会默认返回已resolve的Promise),所以another_func会直接先执行。

解决方案

要让func真正等待所有元素打印完成,需要把func改成返回一个Promise,并在setInterval执行完毕(即i === 4清除定时器时)手动resolve这个Promise。

修改后的完整代码:

const arr = ['a' , 'b' ,'c', 'd']

const func = async () => {
    // 返回Promise,绑定异步操作的完成时机
    return new Promise((resolve) => {
        let i = 0
        let interval = setInterval(() => {
            let x = arr[i++ % arr.length]
            console.log(x)
            if (i === 4 ) {
                clearInterval(interval)
                // 所有元素打印完成,触发Promise完成
                resolve()
            }
        }, 2000)
    })
}

const another_func = () => {
    console.log('logic')
}

const main = async () => {
    await func()
    another_func()
}
main()
关键说明
  • 用new Promise()包裹setInterval逻辑,将定时器的结束时机与Promise的resolve动作绑定
  • 当i === 4清除定时器时调用resolve(),此时func的Promise才会变为完成状态,await func()才会继续执行后续的another_func()
  • 这样就能保证先打印完a、b、c、d,再输出logic

内容的提问来源于stack exchange,提问作者Mohsin Shaikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:05:23