Angularjs 更新';这';Angular JS服务中$Promise内的上下文属性

Angularjs 更新';这';Angular JS服务中$Promise内的上下文属性,angularjs,Angularjs,我的服务中使用的功能定义如下: var getData = function() { return anotherService.getData().$promise; }; 以及我在整个服务过程中操作的这个属性 this.someProperty = 'a string'; 我在我的服务的返回部分调用上述函数: return{ updateProperty: function(){ getData().then(function(data){

我的服务中使用的功能定义如下:

var getData = function() {
        return anotherService.getData().$promise;
};
以及我在整个服务过程中操作的
这个
属性

this.someProperty = 'a string';
我在我的服务的返回部分调用上述函数:

return{
    updateProperty: function(){
        getData().then(function(data){
            this.someProperty = data;
        });
    }
}

在上面,我在我的浏览器控制台中得到了一个
未定义的相关错误。我假设这是因为解析的
$promise
是一个AJAX调用,而
这个
是在上下文之外使用的。在本例中,使用AJAX调用返回的数据操作
this
属性的最佳方法是什么?

如果您在整个服务过程中操作
this
,请将其分配给变量,如
var self=this
。问题在于,
是函数的上下文,可以由其他代码使用
fn.call(context)
fn.apply(context,args)
进行更改。因此,在任何给定函数的范围内,它都可能是不同的

因此,只需将其分配给某个变量并使用它:

var self=this;
返回{
updateProperty:function(){
getData().then(函数(数据){
self.someProperty=数据;
});
}
};

最简单的方法是使用该函数。此函数为函数调用设置“This”上下文。因此,在您的情况下,您必须使用它两次,以便适当的“this”在中填充

return{
    updateProperty: function(){
        getData().then((function(data){
            this.someProperty = data;
        }).bind(this));
    }
}
这是为了确保传递给promise的处理程序使用原始的“This”(传递给updateProperty)执行。现在,要将正确的“this”值传递给updateProperty函数,您应该在控制器中执行以下操作:

(myService.updateProperty.bind(this))();
绑定有很多版本,包括绑定整个服务。此外,还可以查看lodash的函数扩展

我准备了一份报告来证明这一点。它涵盖了我上面列出的内容,以及另一个需要注意的重要事项。当您使用setTimeout时,处理程序在全局上下文(在本例中为“窗口”)中调用,这就是为什么我添加了第三个绑定,以确保“this”在超时处理程序中是相关的。我还添加了各种计数增量调用,以证明“this”在整个过程中是相同的值

如果这是一个重复的场景,您可能希望传递目标对象(然后使用处理程序只是为了知道它已更新),或者传递处理程序(也需要绑定)。我还为这些场景添加了示例

最后一句话,call、apply和bind是javascript的关键,值得学习。花点时间在这上面,努力走出地狱