2

サービスでの $http の処理に関する関連する質問がありますが、少し詳しく説明したいと思います。コントローラーが Angular $http API に似た API を使用してサービス呼び出しを実行できるようにしたいと考えています。

$scope.login = function(user) {
  securityService.login(user).success(function(data) {
    $scope.data = data;
  }).error(function(data) {
    $scope.error = data;
  });
};

これは読みやすい API です。表面的には、サービス API で行う必要があるのは次のことだけです。

return {
  name : 'User Service',
  login : function(user) {
    return $http.post("/api/login", user);
  }
};

素晴らしい、それはプロミスを返し、successメッセージerrorが付属しています。しかし... サービスの成功と失敗のケースに対処したい場合はどうすればよいですか? 素敵で読みやすいサービス API を維持したいと考えています。securityService.currentUser()この場合、 「securityService.isLoggedIn()」などのメソッドを公開できるように、ユーザーを保持したいと思うかもしれません。

$http.post().then(...)promise APIを試しましたが、それらは HTTP 応答全体を返します。ここでも、HTTP をサービスに分離し、同様の具体的なコールバック API を維持したいと考えています。

4

2 に答える 2

5

loginあなたはangularのを使用することであなた自身の約束をすることができます$q

var deferred = $q.defer(), 
    promise = deferred.promise;

$http.post("/api/login", user).success(...).error(...)

return promise;

サービスでの$httpの約束の成功/失敗の範囲内で、延期されたオブジェクトを解決/拒否します。

編集:

を拡張する$http.post

$http.post("/api/login", user).success(function(data) {
  if (data == "foo") { // success case?
    deferred.resolve('you logged in!');
  } else {
    deferred.reject('something really bad happened!');
  }
})
于 2013-01-10T19:07:27.383 に答える
1

テスト ケースを実行したところ、次のようにサービス API から promise を返すと、次のようになります。

return $http.post("/api/login", user).success(...).error(...)

コントローラーでも同じことができます。

service.login(user).success(...).error(...)

両方が呼び出され、最初にサービスが呼び出され、次にコントローラーが呼び出されます。それは最高です!

于 2013-01-10T19:15:42.203 に答える