JavaScript中为何在await旁使用new Promise?看似无需使用的原因
我在javascript.info的async/await教程中看到一段代码:
await new Promise((resolve, reject) => setTimeout(resolve, 3000)); img.remove();,我认为这段代码可改写为await setTimeout(()=>{img.remove()}, 3000),因此产生疑问:既然await可替代.then()和.catch(),为何还要在await旁使用new Promise?即便像本例这样没有成功/失败的条件判断也会使用?
首先要明确:你改写的代码完全达不到原代码的效果。
setTimeout本身返回的是一个数字类型的定时器ID,不是Promise对象。而await的作用是等待Promise(或者实现了then方法的对象)完成,遇到非Promise值会直接跳过等待逻辑。所以await setTimeout(...)不会真的等3秒,img.remove()会立刻执行,根本起不到延迟删除的作用。
原代码里用new Promise包裹setTimeout,核心目的是把回调式的异步操作转换成Promise风格——因为setTimeout是基于回调的原生API,本身不支持Promise,必须手动包装一层,让await能识别并等待这个异步操作结束(也就是3秒后定时器触发,调用resolve完成Promise),之后才会执行后面的img.remove()。
哪怕不需要处理成功/失败的判断,只要你想用await来等待一个回调式的异步操作,就必须做这个Promise包装。这不是多余的步骤,而是await和原生回调API之间的必要“适配”。
内容的提问来源于stack exchange,提问作者lome1446

