访问promise回调中的对象'this'(然后)

时间:2015-12-20 13:41:33

标签: javascript node.js promise

我想在Javascript中创建一个对象。

其中一种方法应该执行一个承诺链。链中的每个方法都必须访问作为对象成员的配置变量。 问题是,this运算符在PromiseMethod2中已更改,我无法访问配置变量(它在PromiseMethod1中正常工作)。

这是我的代码:

var SomeObject(config) {
    var that = this;
    that.config = config;
}

SomeObject.prototype.SomeMethod = function() {
    var that = this;

    that.PromiseMethod1()
      .then(that.PromiseMethod2)
      .catch(console.error);
    }

SomeObject.prototype.PromiseMethod1 = function() {
    var that = this;
    config = that.config;

    return SomePromise();
}

SomeObject.prototype.PromiseMethod2 = function(someParams) {
    var that = this;
    config = that.config;
    params = someParams;

    return SomePromise();
}


var someObject = new SomeObject(someConfig);
someObject.SomeMethod().then(function () {
    console.log('Done!');
}

我想在链中使用委托方法而不是仅执行:

 that.PromiseMethod1().then(function(response) { return that.PromiseMethod2(that, response); };

我无法使用bind方法,因为它在执行回调时看起来会被重新绑定。

有解决方案吗? 为什么PromiseMethod1PromiseMethod2之间存在差异?

1 个答案:

答案 0 :(得分:0)

我会说这是不可能的。您尝试混合两种不同的方法:method chainingpromises chaining。我建议您检查一下您的架构。

唯一可见的东西(但我个人并不喜欢),如果你完全控制你想要使用的所有承诺,就是通过整个承诺链传递配置值。

SomeObject.prototype.init = function() {
    var that = this;

    return new Promise(function(resolve, reject) {
        resolve(that.config)
    });
}
SomeObject.prototype.PromiseMethod1 = function(config, params) {
    return SomePromise(config, params);
}

SomeObject.prototype.PromiseMethod2 = function(config, someParams) {  
    return SomePromise(config, someParams);
}

SomePromise = function(config, params) {
    return new Promise(function(resolve, reject) {
        //some code here
        resolve(config, newParamsFromSomeCode)
    });
}

然后你就可以打电话了:

that.init().then(that.PromiseMethod1).then(that.PromiseMethod2);

但同样,它看起来并不像一个好的代码......