2017-05-08 25 views
0

我在绑定this时遇到了问题。我有角的服务如下功能:

this.database_view_settings = {'habal':'1'} 
this.init = function(){ 
console.log("1",this.database_view_settings) 
return $q((resolve, reject) => { 
console.log("2",this.database_view_settings) 
    AuthenticationService.getToken().then(function(token){ 
    $http.get('/api/user/settings/database_view/get',{headers:{'id_token':token}}) 
    .success(function(data) { 
     console.log("3",this.database_view_settings) 
     this.database_view_settings = data; 
     console.log("login",this.database_view_settings) 
     resolve(this.database_view_settings) 
    }) 
    .error(function(data) { 
     console.log('Error: ' + data); 
     reject(data) 
    }); 
    }.bind(this)) 


    }) 
}.bind(this) 

我的问题是,虽然在console.log 1 and 2我明白我要{'habal':'1'}console.log 3我得到一个undefined,我不明白为什么。

+1

你为什么要这么做?既然你明显使用ES6,那么你应该使用箭头 - 他们正是那里 - 所有承诺回调。该片段格式不正确,无法说出所在的位置。但是,除非你已经完成了“绑定(这个)”到每一个回调(而你没有),否则在某些时候你将不可避免地失去了词法。 – estus

+2

加上它看起来像你陷入[被遗忘的承诺](http://taoofcode.net/promise-anti-patterns/#the-forgotten-promise:8f173b15e2d19515fdc8ce931ae539c0)反模式。 – sp00m

+1

['.success'和'.error'方法已被弃用并从AngularJS中移除](http://stackoverflow.com/questions/35329384/why-are-angular-http-success-error-methods-deprecated-除去从 - V1-6/35331339#35331339)。当$ http服务已经返回承诺时,也不需要使用'$ q(resolve,reject)'来制造承诺。 – georgeawg

回答

2

这需要添加到您的问题考虑的评论:

this.database_view_settings = { 'habal': '1' }; 

this.init =() => AuthenticationService.getToken() 
    .then((token) => $http.get('/api/user/settings/database_view/get', { headers: { 'id_token': token } })) 
    .then((data) => { 
    this.database_view_settings = data; 
    return data; 
    }); 

然后,其他地方:

this.init().then((data) => { 
    // do your stuff with data 
}).catch((error) => { 
    // oops... 
}) 
+0

比我的代码更具可读性,它也可以工作。我不得不改变一件事:'this.database_view_settings = data.data'就是我得到的数据(在你的数据中是整个http响应)。 – fbence

0

我怀疑你的问题是因为你没有将this绑定到你的$http.get成功函数。话虽如此,如果您的目标是持续不断地将this的参考文件传递给嵌套函数,这实际上是一个很大的约束。您可以在外部函数中使用类似var _this = this的东西,并在所有嵌套函数中引用_this变量。此外,正如评论所建议的那样,使用箭头函数将自动绑定这一点,以使代码更简洁。

最后,无论更改如何,您都不需要绑定this上的主this.init函数。对象属性的this绑定到对象本身,在这种情况下对象是this