Promise.resolve对象不是构造函数

时间:2017-01-18 16:52:39

标签: javascript ecmascript-6 promise

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

例如:

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

为了单独测试公共方法,我通过使私有方法返回一个空的promise来存根。 出于某种原因,如果我指定

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

一切都很好,无论如何做

foo.privateMethod = Promise.resolve;

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

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

2 个答案:

答案 0 :(得分:6)

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

要确保使用第二种语法正确设置了上下文,请使用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')); 




答案 1 :(得分:-1)

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

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

foo.prototype.publicMethod = ...

然后突然间它是一个实例

foo.privateMethod = ...

虽然人们会期待

foo.prototype.privateMethod = ...

如果某个地方以后你尝试使用foo,这是一个实例,因为它是一个构造函数:

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

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