所以我很困惑。我之前在控制器中使用了角度承诺:
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搜索了很多东西。我希望在服务中提供此功能,以防止在多个控制器中重复大块代码。我可以不在服务中创建承诺吗?如果是这样,那么如何正确地做任何帮助都是值得赞赏的....谢谢!
答案 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