无法将原型函数放入promise解析中吗?

时间:2015-07-08 17:33:41

标签: javascript node.js promise

使用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中解析原型函数?有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

this不是一个静态的东西。它可以根据调用使用this的函数进行更改。在某些情况下,这可能是您刚刚调用的对象,但在这种情况下,它不是。

当您从promise链中到达foo.insideResolve时,ThisBinding将丢失。为了解决这个问题,您可以使用Function.prototype.bind方法,该方法需要一些参数 - 第一个参数是要绑定要使用的函数的this上下文,其他参数是部分应用。 bind函数返回一个函数,该函数在被调用时将this和参数传递给原始函数。

简而言之:

使用foo.insideResolve.bind(foo)代替foo.insideResolve