【问题标题】:do promises behave differently in services vrs controllers?承诺在服务和控制器中的行为是否不同?
【发布时间】:2016-05-27 04:00:26
【问题描述】:

所以我很困惑。在与此类似之前,我在控制器中使用了角度承诺:

thisCtrl.someFunction = function (data){
   //...
}

ApiCall.get.something().then(function(data){
   thisCtrl.newData = data;
   thisCtrl.someFunction(thisCtrl.newData);
});

然后我就可以在整个控制器中使用 thisCtrl.newData(在 Promise 中创建)。我还能够使用在 promise 之外、在 promise 中定义的函数——如上面的例子所示。

由于某种原因,在尝试在服务中执行此操作时,我似乎无法使其工作。尝试使用与上述相同的模式:

this.someFunction = function (data){
   //...
}

ApiCall.get.something().then(function(data){
   this.newData = data; // Cannot read property of 'newData' of undefined
   this.someFunction(thisCtrl.newData); //error: Cannot read property of 'someFunctions' of undefined
});

因此,一旦我在服务中执行相同的操作,这似乎超出了范围 - 使我在将数据传递给服务的其余部分或使用来自其余部分的任何数据时有点无助服务里面的承诺。我尝试将数据作为对象返回:

ApiCall.get.something().then(function(data){
    return {
       data: data
    }
});

但它也返回了一个承诺,让我在同一条船上。我实际上已经尝试了很多东西,并且用谷歌搜索了很多东西。我希望它可以在服务中使用,以防止在多个控制器中重复大块代码。我不能在服务内部创建承诺吗?如果是这样,对于如何正确执行此操作的任何帮助表示赞赏....谢谢!

【问题讨论】:

    标签: angularjs service promise


    【解决方案1】:

    当你使用“this”时,它可能不是你所期望的,因为“this”取决于函数上下文。

    要确保您绑定到正确的函数上下文,请使用“fn.bind(this)”

    ApiCall.get.something().then(function(data){
           this.newData = data;
           this.someFunction(...);
    }.bind(this));
    

    或者,为了更广泛的跨浏览器兼容性,您可以在外部函数范围内将“this”保存为“self”,以便您可以在内部函数中使用它:

    var self = this;
    ApiCall.get.something().then(function(data){
           self.newData = data;
           self.someFunction(...);
    });
    

    有关更多信息,请查看此参考:https://codereview.stackexchange.com/questions/49872/using-var-self-this-or-bindthis

    【讨论】:

    • 外部的 var self 为我工作。我之前尝试过,但不知何故做错了。谢谢!下次我也试试绑定!
    猜你喜欢
    • 2015-12-02
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2020-07-20
    • 1970-01-01
    • 2016-01-01
    相关资源
    最近更新 更多