Typescript中setTimeout结合async/await执行顺序异常问题求解
输出顺序异常原因
async修饰的函数如果没有显式返回自定义Promise,默认会直接返回状态为fulfilled的空Promise。你写的delay2里只是调用了setTimeout就直接结束了,不会等待定时器回调执行,await delay2(2000)不会产生实际的等待效果,调用完立刻就向下执行后续代码。setTimeout属于宏任务,会被推入事件队列等待同步代码、微任务全部执行完成后才会触发回调。所以会先执行3 - after、4 - done,等2秒计时结束后才会打印2 - timeout。
修复方案
修改delay2函数,返回一个在定时器回调中触发resolve的Promise,就能让await正确等待计时结束再向下执行:
const delay2 = (ms: number) => new Promise<void>((resolve) => { setTimeout(() => { console.log('2 - timeout') resolve() }, ms) }) const mainAsync2 = async () => { console.log('1 - before'); await delay2(2000); console.log('3 - after'); } mainAsync2() .then(res => console.log('4 - done'));
修改后输出顺序就会符合预期:
1 - before 2 - timeout 3 - after 4 - done
内容的提问来源于stack exchange,提问作者tm1701
相关产品推荐
相关产品推荐

