2017-07-25 52 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模塊asynchronus。我建立了一個服務:

.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變化。得到響應數據後,你可以調用的函數,這時候EntityId不會undefined

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