Promise.resolve()
问题
以下代码执行结果是?
Promise.resolve({
then: function () {
console.log('a');
}
}).then(() => {
console.log('d');
});
首先第一直觉就是打印 d
,当结果却是 a
。立马去翻了 MDN ,果然发现了一些细节上的问题。
当传入对象是一个 thenable
[1] 时,相当于返回一个新的 Promise 对象,状态依赖于该对象 then
方法。
Promise.resolve({ then: () => {} }).then(() => console.log('object'));
// output:
// 整个 Promise.resolve({ then: () => {} }) 返回状态处于 pending
Promise.resolve({ then: res => res() }).then(() => console.log('object'));
// output: object
Promise.resolve('object').then(res => console.log(res));
// output: object
let a = Promise.resolve('object');
Promise.resolve(a).then(res => console.log(res));
// output: object
// 参数时 promise 对象,直接返回该 promise
let a = Promise.resolve('object');
let b = Promise.resolve(a);
Promise.resolve(b).then(res => console.log(res));
// output: object
// 参数是嵌套 promise 对象,返回展平后的 promise
总结
- 返回值一定是一个
Promise
对象; - 如果参数是一个
Promise
对象,则返回这个这个对象; - 如果参数是一个多层嵌套
Promise
对象,则返回展平的Promise
对象; - 如果参数是一个
thenable
,则返回Promise
状态跟随这个thenable
对象; - 否则返回一个以该参数完成的
Promise
。
带有 then 方法,这个方法的参数分别是
resolve
和reject
。 ↩︎