承诺在服务vrs控制器中的行为有何不同?

时间:2016-02-16 03:10:28

标签: angularjs service promise

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

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

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

然后我可以在整个控制器中使用thisCtrl.newData(在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
    }
});

但它也回复了一个承诺,让我在同一条船上。我实际上尝试了很多东西,并且用Google搜索了很多东西。我希望在服务中提供此功能,以防止在多个控制器中重复大块代码。我可以不在服务中创建承诺吗?如果是这样,那么如何正确地做任何帮助都是值得赞赏的....谢谢!

1 个答案:

答案 0 :(得分:2)

当你使用“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