为何我的示例中Async/Await无法正常生效?
为什么await setTimeout无法让代码按1→2→3的顺序执行?
嘿,这个问题其实挺多刚上手async/await的开发者都会碰到,我来给你拆解一下问题出在哪~
核心问题:setTimeout不返回Promise
你之所以没得到预期的123输出,是因为**await只能等待Promise对象的状态变更**,但原生的setTimeout返回的是一个定时器的ID(一个数字),并不是Promise。所以你写的await setTimeout(...)其实相当于直接跳过等待,代码会继续执行后面的console.log(3),等定时器回调触发时才会输出2,结果自然还是132。
正确的写法:把setTimeout包装成Promise
要让await能正确等待setTimeout的回调执行,你需要把setTimeout包装成一个返回Promise的函数,这样await才能识别并等待它完成。
修改后的代码如下:
(async () => { console.log(`1`); // 把setTimeout包装成Promise await new Promise(resolve => { setTimeout(() => { console.log(`2`); resolve(); // 回调执行完后resolve,告诉await可以继续了 }, 0); }); console.log(`3`); })();
这段代码运行后,控制台就会按顺序输出1→2→3了。
补充说明
async/await是Promise的语法糖,它的核心就是基于Promise工作的。任何你想通过await等待的异步操作,都必须是一个Promise(或者能被转换成Promise的对象)。像setTimeout、setInterval这类传统的异步API,都需要手动包装成Promise才能和async/await配合使用。
内容的提问来源于stack exchange,提问作者AmerllicA
相关产品推荐
相关产品推荐

