2017-07-25 104 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);