【问题标题】:Promise.resolve object is not a constructorPromise.resolve 对象不是构造函数
【发布时间】:2017-06-03 03:58:26
【问题描述】:

我有一个有两种方法的对象。 foo.publicMethod() 将在内部调用 foo.privateMethod()

例如:

foo.prototype.publicMethod = function() { 
   return this.privateMethod()
       .then(/* Do some other stuff */); 
};

为了单独测试公共方法,我对私有方法进行了存根,使其返回一个空的承诺。 出于某种原因,如果我分配

foo.privateMethod = () => Promise.resolve();

一切都很好,但是做

foo.privateMethod = Promise.resolve;

产生错误消息:TypeError: object is not a constructor

我看不出这两行代码会如何产生不同的结果。是的,一个在技术上包装Promise.resolve 一次,但我不明白这应该如何影响最终结果。任何想法可能有什么区别?

【问题讨论】:

  • 产生错误信息 — 什么时候?在哪里?该行本身并不是错误。

标签: javascript ecmascript-6 promise


【解决方案1】:

两者并不完全相同。在工作版本中,resolve 调用的上下文是Promise 对象。在第二个版本中,上下文是调用 privateMethod 时使用的任何上下文,当您将其称为 foo.privateMethod() 时,它将是 foo

要确保使用第二种语法正确设置上下文,请使用bind

foo.privateMethod = Promise.resolve.bind(Promise);

function Foo() {}

Foo.prototype.publicMethod = function() { 
   return this.privateMethod(); 
};

var foo = new Foo();
foo.privateMethod = Promise.resolve.bind(Promise);

// Test it
foo.publicMethod().then ( _ => console.log('done')); 

【讨论】:

  • 它总是undefined,因为resolve是在严格模式下定义的。
  • 不一定是未定义的,如果他们在做foo.privateMethod(),那么this就是foo
【解决方案2】:

这只是一个猜测,但您可能在代码中的某个地方覆盖了foo,您首先将其定义为构造函数,然后用实例覆盖它。

我的猜测是基于你如何使用foo,首先你分配给它的原型

foo.prototype.publicMethod = ...

但突然之间它是一个实例

foo.privateMethod = ...

虽然人们会期望

foo.prototype.privateMethod = ...

如果稍后您尝试使用foo,它是一个实例,因为它是一个构造函数:

var f = new foo(); // foo is not a constructor function

但是,查看导致问题的确切行可能会有所帮助,您在两个版本中显示的作业不能仅以您发布的错误消息结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 2013-10-20
    • 2021-10-22
    • 2018-01-18
    相关资源
    最近更新 更多