为何相同10秒延迟下,Promise对象的resolve时机存在差异?
为什么两段延迟Promise的状态变化时机不同?
先看两段代码:
Code1
let p = new Promise((resolve,reject) => { setTimeout(() => {console.log("itsdone"); resolve("done");},10000); });
Code2
let p = new Promise((resolve,reject) => { setTimeout(resolve("done"),10000); });
核心差异原因
Code1逻辑符合预期:你给
setTimeout传递的是一个箭头函数,这个函数不会立即执行,要等10秒后才会被调用。箭头函数内部才会触发console.log和resolve("done"),所以Promise的状态会在10秒后变为resolved。Code2的问题出在调用方式:这里你直接执行了
resolve("done"),而不是把它作为回调函数传给setTimeout。resolve("done")会立即执行,瞬间把Promise的状态改成resolved。而resolve函数的返回值是undefined,相当于你给setTimeout传的第一个参数是undefined,第二个是10000——这时候setTimeout相当于白设置了,因为它要求第一个参数必须是函数,而非undefined。
修正Code2的方法
如果想让Code2和Code1一样10秒后resolve,得把resolve包装成函数传给setTimeout:
let p = new Promise((resolve,reject) => { setTimeout(() => resolve("done"),10000); });
内容的提问来源于stack exchange,提问作者Divyanshu Rai
相关产品推荐
相关产品推荐

