使用Node.js的Q library,当我尝试将对象原型函数传递给promise中的.then
解析器时,它失去了this
的上下文:
Foo.prototype.outsideResolve = function() {
var that = this;
return q.Promise(function(resolve, reject) {
console.log(that); // {data: "foo"}
resolve();
});
};
Foo.prototype.insideResolve = function() {
var that = this;
return q.Promise(function(resolve, reject) {
console.log(that); // undefined
resolve();
});
};
Foo.prototype.async = function() {
var foo = this;
return q.Promise(function(resolve, reject) {
foo.outsideResolve()
.then(foo.insideResolve)
.then(resolve)
.fail(reject)
.done();
});
};
为什么会这样?这是预期的行为吗?您是不是应该能够在promise中解析原型函数?有办法解决这个问题吗?
答案 0 :(得分:1)
this
不是一个静态的东西。它可以根据调用使用this
的函数进行更改。在某些情况下,这可能是您刚刚调用的对象,但在这种情况下,它不是。
当您从promise链中到达foo.insideResolve
时,ThisBinding将丢失。为了解决这个问题,您可以使用Function.prototype.bind
方法,该方法需要一些参数 - 第一个参数是要绑定要使用的函数的this
上下文,其他参数是部分应用。 bind
函数返回一个函数,该函数在被调用时将this
和参数传递给原始函数。
简而言之:
使用foo.insideResolve.bind(foo)
代替foo.insideResolve
。