2016-08-31 8 views
4

私はユーザーサービスを持っています。私が構築した別のサービスを利用する方法を作りたいと思います。このサービスには2つの方法があります。 getUser()およびgetCurrentUser()getCurrentUser()は、UIDを取得する注入サービスを利用します。返されたUIDを使用してgetUser()メソッドを実行します。私の問題は、getCurrentUser()に2番目のティア約束​​を返すことができないということです。AngularJS:内部からの約束を返す?

この質問は説明するのが少し難しいです。

self.getCurrentUser = function() { 
    return loginService.getCurrentUid().then(function(response) { 
     if (response.data === 'false') { 
      alertBoxService.trigger($rootScope.unexpectedApiResponse); 
      return $q.reject(response); // convert into a rejection 
     } 
     return self.getUser(response.data); // chain the promise resolution 
    }, function(response) { 
     alertBoxService.trigger($rootScope.asyncFailed); 
     return $q.reject(response); // chain the rejections 
    }); 
} 

あなたはもちろんの$qサービスを注入する必要があります...ここで

svs.service("usersService", function($rootScope, $http, loginService, alertBoxService) { 
    var self = this; 
    self.getUser = function(identifier, column) { 
    if (typeof(column) === 'undefined') column = "uid"; 
    return $http.get($rootScope.api + "/getUser/" + identifier + "/" + column); 
    } 
    self.getCurrentUser = function() { 
    var currentUserPromise; 
    loginService.getCurrentUid().then(
     function(response) { 
     if (response.data === "false") { 
      alertBoxService.trigger($rootScope.unexpectedApiResponse); 
     } else { 
      console.log(self.getUser(response.data)); 
      currentUserPromise = self.getUser(response.data); 
     } 
     }, function(response) { 
     alertBoxService.trigger($rootScope.asyncFailed); 
     } 
    ); 
    return currentUserPromise; 
    } 
}); 
+0

[もちろん、](http://stackoverflow.com/q/23667086/1048572)。しかし、その変数はまったく必要ありません! – Bergi

答えて

2

チェーンの約束を...コードだが、あまりにもチェーンに拒否を忘れないでください。


Bergi kindly pointed outとして、あなたはまた、例えば、エラーを投げる代わりに$q.rejectを使用して約束を拒否することができます

throw response; 
+0

あなたは最初に追加された 'return'を強調したいかもしれませんが、それは' then'について学ぶ人々によって容易に忘れられます – Bergi

+0

'$ q'でここで何をしていますか? – Allenph

+1

'$ q.reject'を使うのではなく、単にエラーを再現することができます。 – Bergi

0

ここでの問題は、機能getCurrentUserが呼び出されるとき、それはすぐにundefinedを返すということです変数。これは、サービスが非同期であり、応答がサービスで受信されるまでに、関数呼び出しはすでにundefinedという変数を返していたはずです。これを防ぐには、の中にreturnコールを追加することができます。

0

成功コールバックの中から約束を返す非同期関数の場合、約束オブジェクトであるコールバックから戻り、主関数から戻り、呼び出し元に約束を提供する必要があります。

これを試してください。

svs.service("usersService", function($rootScope, $http, loginService, alertBoxService) { 
    var self = this; 
    self.getUser = function(identifier, column) { 
    if (typeof(column) === 'undefined') column = "uid"; 
    return $http.get($rootScope.api + "/getUser/" + identifier + "/" + column); 
    } 
    self.getCurrentUser = function() { 
    return loginService.getCurrentUid().then(
     function(response) { 
     if (response.data === "false") { 
      alertBoxService.trigger($rootScope.unexpectedApiResponse); 
     } else { 
      console.log(self.getUser(response.data)); 
      return self.getUser(response.data); 
     } 
     }, function(response) { 
     alertBoxService.trigger($rootScope.asyncFailed); 
     } 
    ); 
    } 
});