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

  1. 带有 then 方法,这个方法的参数分别是 resolvereject↩︎

posted @ 2022-02-21 22:42  梦渊同学  阅读(163)  评论(0)    收藏  举报