2017-07-25 15 views
0

私の機能は、http要求の応答を待ってからさらに進むという問題があります。私は待つ約束を使用することができますが、私はその概念を理解していないことを知っています。

私はすべてのHTTPリクエスト持つデータ・サービスがあります。別のサービスから

function GetGroupIdFromBakery(bakeryId, successCallback, errorCallback) { 
     $http.get(service.baseUrl + "BakeriesGroup/Bakeries/" + bakeryId) 
      .then(function (result) { successCallback(result.data); }, errorCallback); 
    } 

を、私は、データサービスを呼び出す:

var hasPermission = function (permission, params) { 
      permissionRoute = permission; 
      setIdEntity(params); 
      for (var i = 0; i < permissions.length; i++) { 
       if (permissionRoute.Name === permissions[i].Name) { 
        if (permissions[i].Scope == "System") 
         return true; 
        else if (permissions[i].Scope == permissionRoute.Scope && permissions[i].IdEntity == permissionRoute.IdEntity) 
         return true; 
       } 
      } 
      return false; 
     } 



var setIdEntity = function (params) { 
      if (permissionRoute.Scope == "Bakery") 
       permissionRoute.IdEntity = parseInt(params.bakeryId); 
      else if (permissionRoute.Scope == "Group") { 
       if (params.bakeriesGroupId) 
        permissionRoute.IdEntity = parseInt(params.bakeriesGroupId); 
       else { 
        getGroupOfBakery(parseInt(params.bakeryId)); 
       } 

       console.log(permissionRoute.IdEntity); 
      } 
     } 

var getGroupOfBakery = function (bakeryId) { 
      DataService.GetGroupIdFromBakery(bakeryId, function (groupId) { 
       permissionRoute.IdEntity = groupId; 
      }, function (error) { 
       console.error("something went wrong while getting bakery"); 
       alert("Une erreur s'est produite lors de la récupération de la boulangerie"); 
      }); 

     } 

私はDataService.GetGroupIdFromBakeryの応答を待つ必要があります( )。このコードでは、getGroupByBakery()を呼び出すとpermission.EntityIdは未定義です。

誰かが私を助けてくれますか?

+1

これはできません。約束を使う必要があります。 – SLaks

+0

コールバックを使用することはできますか? – Liline

答えて

0

$ httpモジュールが非同期なので、まさに約束を使わなければなりません。その後、

.service('RequestService', function($q, $http){ 
    return { 
    call: function(htmlOptions){ 
     var d = $q.defer(); 
     var promise = d.promise; 
     $http(htmlOptions) 
     .then(function(response){ 
      d.resolve(response.data); 
     }, function(response){ 
      d.reject(response.data); 
     }); 
     promise.success = function(fn) { 
     promise.then(fn); 
     return promise; 
     }; 
     promise.error = function(fn) { 
     promise.then(null, fn); 
     return promise; 
     }; 
     return promise; 
    } 
    } 
}) 

そして:私はそのためのサービスを建て

RequestService.call({ 
    method: 'POST' //GET, DELETE ... 
    data: data, 
    url: 'http://someurl.com/' 
    }); 
+0

これは遅延プロミスの反パターンです。 https://stackoverflow.com/a/30757201/4735725をご覧ください。 –

1

あなたの応答データにウォッチャを追加することができます。あなたの場合はEntityIdだと思います。 EntityIdが変更されるとすぐに実行されます。応答データを取得した後、関数を呼び出すことができますが、今回はEntityIdundefinedになりません。

$scope.$watch(function() { 
      return EntityId 
     }, function (newEntityId) { 
      if(newEntityId != undefined { 
       // now you can call your function 
      } 
      } 
     }, true); 
関連する問題