http://es6.ruanyifeng.com/#do...
这个是阮一峰老师关于Promise.resolve()参数的解读,其中参数是thenable对象时,Promise.resolve方法会将这个对象转为 Promise 对象,然后就立即执行thenable对象的then方法。
问题来了:
new Promise(resolve => {
resolve(1);
Promise.resolve({
then: function(resolve, reject){
console.log(2);
resolve(3)
}
}).then(t => console.log(t))
console.log(4);
}).then(t => console.log(t));
console.log(5);
控制台输出:4 5 2 1 3
下面按照最开始的理解,将上述代码进行转换
new Promise(resolve => {
resolve(1);
new Promise(resolve=>{
console.log(2);
resolve(3)
}).then((t) => console.log(t));
console.log(4);
}).then(t => console.log(t));
console.log(5);
控制台输出 2 4 5 3 1
顺序不一样。。我很崩溃 求解答
你要理解两点,
这个平台代码是指:
很多人就是忽略了 promise 实现的代码也是算做平台代码的。
那么看回例子,
new Promise([executor])
首先执行,进入 executor 函数。resolve(1);
这个 Promise 马上由 pending 状态过渡到 fulfill 状态。这个带1
的任务被压到前面提到的栈中。Promise.resolve([object])
,这个带[object]
的任务被压到栈中。console.log(4);
。console.log(5);
。[object]
的任务,因为这个 object 中有then
方法,直接当新的 executor 调用。console.log(2)
。resolve(3)
,因为本轮的栈还没处理完(Promise 底层也属于“平台代码”),这个带3
的任务被压到下一轮的栈中。1
的任务,.then(t => console.log(t));
打印1
。3
。