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

时间:2019-06-02 09:16:56

标签: javascript ecmascript-6 es6-promise

问题是标题。我试图更深入地了解诺言,并且我想通过查看MDN上的示例来弄清楚Promise.resolve(thenable)的工作原理,或者至少主要是它的工作原理。我想知道两者之间是否有区别。我整理了这个示例,以说明它们的行为相同,我认为如果有的话,它们会表现出不同的行为。但是显然,仅凭此测试不足以得出结论,它们没有什么不同,所以我来了。

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

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

3 个答案:

答案 0 :(得分:4)

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

但是,有一些区别:

  • thenable的then方法被称为onable对象的方法(在this上下文上),与您的new Promise(thenable.then)不同-.bind(thenable)解决这个问题。
  • Promise.resolve(显然)必须首先检查所传递的对象是否完全可以翻译,它还可以处理访问(而非调用).then引发的晦涩情况
  • 时间上的细微差异: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");
    

答案 1 :(得分:2)

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

  • 两者均支持resolve, reject作为参数。
  • 如果在then(resolve) { ... }内引发错误,则将隐式捕获该错误,并且承诺将被拒绝。
  • then(resolve) { ... }解决thenable会导致无限递归。

答案 2 :(得分:-1)

您必须了解差异。

thenable就是具有then-method方法的任何对象。异步函数对象的承诺和返回既可以,也可以自定义。

异步函数对象是没有承诺的!他们对自己的回报作出了承诺。

承诺是最复杂的物资类型。它们提供了诸如catch和finally的其他方法,还具有诸如Promise.all和Promise.resolve之类的静态方法。

您的p1传递的方法名称表示一个(通常)已解析的Promise,其值可为。 <-通常在初始化时解决,但由于您提供可转换的值

您的p2使用thenable.then创建一个未解决的Promise,然后作为resolve的回调。 <-初始化时未解决

希望这对您有所帮助。