我有一个使用promise的函数,并在该promise实现时调用另一个函数。我试图窥探在promise中执行的函数。然后,我无法获得预期的calls.count(),而我无法理解我做错了什么。< / p>
var MyClass = function() {};
MyClass.prototype.doSomething = function(id) {
var promise = this.check(id);
promise.then(function(result) {
this.make();
});
return promise;
};
MyClass.prototype.make = function() {};
describe('when', function() {
var myClass;
beforeAll(function() {
myClass = new MyClass();
});
it('should', function(done) {
spyOn(myClass, 'check').and.callFake(function() {
return Promise.resolve();
});
spyOn(myClass, 'make');
myClass.doSomething(11)
.then(function() {
expect(myClass.make.calls.count()).toEqual(1); // says it is called 0 times
expect(myClass.check.calls.count()).toEqual(1); // says it is called 2 times
done();
});
});
});
答案 0 :(得分:2)
如果您的承诺与A +规格保持一致,那么:
promise.then(function(result) {
this.make();
});
不行。由于规范要求this
没有价值。
2.2.5 onFulfilled和onRejected必须作为函数调用(即没有此值)。 [3.2]
你需要这样做:
var that = this;
promise.then(function(result) {
that.make();
});
此外,请注意,返回的承诺将在fulfill
返回的承诺的同时尝试reject
或promise.then(..)
其他排队的承诺,除非您这样做:
promise = promise.then(..)
答案 1 :(得分:0)
你必须通过在承诺中回复承诺
来尊重Promise链var that = this; // according to MinusFour answer
promise.then(function(result) {
return that.make();
});
return promise;