2017-05-08 4 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で私はconsole.log 3{'habal':'1'}にしたいものを見る間、私はundefinedを取得し、私はその理由を理解していないということです:私は、角度サービスで、以下の機能を持っています。

+1

?あなたは明らかにES6を使用しているので、すべての約束コールバックのために矢印を使用する必要があります。スニペットのフォーマットが間違っていて、どこに何があるのか​​は分かりません。しかし、コールバックごとに '.bind(this) 'を実行しない限り、あなたは必然的にある時点でレキシカルを失うことになります。 – estus

+2

それはあなたが[The Forgotten Promise](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.init().then((data) => { 
    // do your stuff with data 
}).catch((error) => { 
    // oops... 
}) 
+0

私のコードよりも読みやすく、また動作します。私は一つのことを変えなければならなかった: 'this.database_view_settings = data.data'は私のバージョンで得たデータを私に与えるものです(あなたの'データ 'はhttpレスポンス全体でした)。 – fbence

0

$http.get成功関数にthisをバインドしていないため、問題が発生している可能性があります。つまり、thisの参照をネストされた関数に引き続き渡すことが目的であれば、これは本当に拘束力があります。代わりに、外側の関数にvar _this = thisのようなものを使用し、ネストしたすべての関数の変数_thisを参照することができます。また、コメントによって示唆されているように、arrow関数を使用すると自動的にこれがバインドされ、よりクリーンなコードになります。

最後に、変更内容にかかわらず、thisをメインのthis.init機能にバインドする必要はありません。オブジェクトのプロパティのthisはオブジェクト自体にバインドされています。この場合、オブジェクトはthisです。どこか他の、そして、

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; 
    });