Promise.resolve(thenable) 和 new Promise(thenable.then) 有什么区别?

What is the difference between Promise.resolve(thenable) and new Promise(thenable.then)?

问题是标题。我正在尝试更深入地了解 promises,我想我已经弄清楚 Promise.resolve(thenable) 是如何工作的,或者至少大部分是如何工作的,查看 MDN 上的示例。我想知道两者之间是否有区别。我提出了这个例子来展示它们的行为相同,如果有的话,我认为会以这种方式显示行为差异。但很明显,仅凭这个测试还不足以得出他们没有什么不同的结论,所以我来了。

let thenable = {
    then(resolve) {
        setTimeout(()=>{
            resolve((()=>{
                console.log('test');
                return thenable;
            })());
        }, 1000);
    },
};

let p1 = Promise.resolve(thenable);
let p2 = new Promise(thenable.then);

这两个构造之间应该没有任何区别(Promise.resolve(thenable)new Promise(thenable.then)

  • 两者都支持resolve, reject作为参数。
  • 如果在 then(resolve) { ... } 中抛出错误,它将被隐式捕获并且承诺将被拒绝。
  • thenable 解析 then(resolve) { ... } 会导致无限递归。

在您的示例中,两者的工作原理基本相同。你是对的,将 resolvereject 传递给 thenable 的 then 方法调用基本上是当你用 thenable 对象解决承诺时发生的事情。

但是,有一些不同:

  • thenable 的 then 方法被称为 thenable 对象上的方法(使用 this 上下文作为),这与您的 new Promise(thenable.then) 不同 - a .bind(thenable) 会解决这个问题。
  • Promise.resolve(显然)必须首先检查传递的对象是否是一个 thenable,它还处理访问(而不是调用).then throws
  • 的模糊情况
  • 时间上的细微差异:Promise.resolve 甚至异步安排 then 调用:

    Promise.resolve({
      get then() {
        console.log("property access");
        return function(res, rej) {
          console.log("method call");
          res("fulfillment");
        };
      }
    }).then(console.log);
    console.log("sync execution end");