JavaScript中如何实现a()执行完毕后再执行b()?
问题核心
你的代码的根本问题是 setTimeout 本身不会返回 Promise 对象,await 对原生 setTimeout 无效。
await 只有在后面接 Promise 实例时,才会等待 Promise 状态从 pending 变为 fulfilled/rejected 后,再执行后续逻辑。你直接写 await setTimeout(...) 时,setTimeout 执行后会立刻返回一个数值类型的定时器ID,不属于 Promise,所以 await 会直接跳过等待,a() 函数会立刻执行完成进入已完成状态,触发后续的 then(b) 回调。此时定时器的回调还没到触发时间,所以会先打印 b,等300ms后定时器回调触发才会打印 a。
另外你代码里的 await console.log(xxx) 写法也没有实际作用,console.log 是同步方法,返回值不是 Promise,加 await 不会产生等待效果。
修复方案
首先把定时器封装成 Promise 版本:
// 封装基于Promise的延迟方法 function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)) }
再修改你的业务代码:
async function a() { await delay(300) console.log('a') } function b() { console.log('b') } a().then(b)
修改后执行顺序就会符合预期,控制台先打印 a 再打印 b。
内容的提问来源于stack exchange,提问作者Erika Molidva
相关产品推荐
相关产品推荐

