angularjs等待来自$ http

时间:2017-07-25 14:22:52

标签: angularjs

我遇到的问题是我的功能并没有等待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是未定义的。

有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:1)

您可以在响应数据中添加观察程序。我认为你的情况是EntityId。 它会在EntityId更改后立即执行。获取响应数据后,您可以调用该函数,这次EntityId将不会是undefined

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

答案 1 :(得分:0)

确切地说,你必须使用promises,因为$ 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/'
  });

答案 2 :(得分:0)

您应该使用defer。 在GetGroupIdFromBakery方法中创建一个新的延缓对象,成功的部分解决了延缓,失败的部分拒绝了延缓,最后返回了延缓的承诺。

function GetGroupIdFromBakery(bakeryId, successCallback, errorCallback, $q) {
    var defer = $q.defer();
    $http.get(service.baseUrl + "BakeriesGroup/Bakeries/" + bakeryId)
        .then(function (result) { 
           successCallback(result.data);
              defer.resolve(result.data); 
           }, function(){
              defer.reject(); 
           });
   return defer.promise;
}

这成功地向您返回一个承诺,您可以使用.then()进行调用,并在需要获取GetGroupIdFromBakery数据的服务中作为值接收。

getGroupOfBakery(parseInt(params.bakeryId), $q).then(function(data){
    // here you have data
})

请注意,您应该注入$ q,在这里我以为我们已经在使用$ q,并将其传递给了方法。