【问题标题】:Setting Member Variable from within returned promise从返回的承诺中设置成员变量
【发布时间】:2015-08-16 18:41:58
【问题描述】:

我有一个问题,我觉得它与 javascript 的特性有关。基本上,我正在尝试将成员/类变量设置为来自 promise 的 then 函数。例如:

 this.intuitAuth.authenticate()
      .then(function(oauthObj){
        this.setOauthObj(oauthObj);

        return oauthObj;
      });

其中this.setOauthObj(oauthObj); 设置外部对象的成员变量。现在我想我的问题可能是this 是问题,因为我认为this 指的是then 函数中的函数。所以我的问题是,我怎样才能在一个承诺的then 函数中设置一个成员变量?或者它甚至可能。

我想要完成这个的原因是因为我想在对象的实例中设置这个变量,所以我不必将它作为参数传递给每个方法调用。

【问题讨论】:

    标签: javascript node.js promise this q


    【解决方案1】:

    函数的 this 关键字 在 JavaScript 中的行为略有不同 与其他语言相比。它之间也有一些区别 strict mode 和非严格模式。

    至少有两种方法可以解决问题:

    Bind

    假设 this.intuitAuth 中使用的 this 是所需的 this,那么您可以将函数范围绑定到它,如下所示:

    this.intuitAuth.authenticate()
        .then(function(oauthObj){
            this.setOauthObj(oauthObj);    
            return oauthObj;
         }.bind(this));
    

    保留对所需this 的引用。

    var _this = this;
    this.intuitAuth.authenticate()
        .then(function(oauthObj){
            _this.setOauthObj(oauthObj);    
            return oauthObj;
         });
    

    现在,其中任何一个都很可能解决您当前的问题。但是您需要了解问题存在的原因,因此您应该阅读更多关于 how the value of this is set in a scope 的信息。

    【讨论】:

    • “有点不同” :D,尽管我认为使用 var_this = this 不是最佳实践。它可能会让人感到困惑。在这种特殊情况下,您可以逃脱 then(setOauthObj.bind(yourThis)); ,没有返回值...
    • 就个人而言,我通常选择var self = this; 或根据上下文选择var simulator = this;。但这不是目前的重点。问题不在于最佳实践,而在于对概念的误解。所以我对清楚地传达信息比其他任何事情都更感兴趣。在任何情况下,OP 都有责任将变量命名为他/她认为最方便的名称。不过感谢您的意见,值得考虑。
    • @webduvet,关于“没有返回值的意义”,如果我们要简化为.then(this.setOauthObj.bind(yourThis))(有或没有绑定),那么在返回值方面我们是财富的人质;我们不知道this.setOauthObj() 返回什么,它可能不是所需要的。因此,在没有看到.setOauthObj() 的情况下,显式返回oauthObj 是必要的。
    • @IgweKalu,您需要var _this = this.bind(this),而不是两者。
    • @Roamer-1888,您没有分配或调用返回值。无需退货。
    猜你喜欢
    • 2015-04-30
    • 2017-10-09
    • 2016-09-18
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    相关资源
    最近更新 更多