JavaScript中如何正确await无返回值的void异步函数?
问题原因分析
你的两次代码都无法达到预期的核心原因是:setTimeout 属于异步宏任务,不会阻塞主线程执行。你之前编写的asyncer函数执行时,只会把setTimeout的回调推入异步任务队列,就立刻返回了状态为已完成的Promise,此时await识别到Promise已完成,就会直接执行后续代码,等主线程任务全部清空后才会执行setTimeout的回调打印async msg,因此才会出现打印顺序颠倒的问题。
解决方案
要让await等到setTimeout内部逻辑执行完成再往下走,需要把异步逻辑包装成可主动控制状态的Promise,在异步操作完成的位置手动触发resolve即可。如果是无返回值的void场景,直接resolve空值即可:
function asyncer() { // 手动返回Promise,自行控制异步完成的触发时机 return new Promise((resolve) => { setTimeout(() => { console.log("async msg") // 异步逻辑执行完成后再resolve,通知await可以继续向下执行 resolve() }, 0) }) } async function helloer() { await asyncer() console.log("hello") } helloer()
上述代码运行后会先打印async msg,再打印hello,符合预期效果。如果不需要asyncer返回任何业务值,resolve不传入任何参数即可,完全满足你要await无返回值void函数的需求。
内容的提问来源于stack exchange,提问作者Jip Helsen
相关产品推荐
相关产品推荐

