【问题标题】:angularjs wait for response from $httpangularjs 等待来自 $http 的响应
【发布时间】:2017-07-25 14:22:51
【问题描述】:

我的问题是我的函数没有等待http请求的响应而走得更远。我知道我可以使用 promise 来等待,但我不明白这个概念。

我有一个包含所有 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 未定义。

有人可以帮帮我吗?

【问题讨论】:

  • 你不能那样做。你需要使用承诺。
  • 可以使用回调吗?
  • 也许我错了,但对我来说,承诺回调。我确信它们在引擎盖下是相同的。不管怎样,你说“I know that I can use promise to wait but I don't understand the concept”;一开始我也没有,然后我开始认为它们在功能上完全相同,然后它就响了。纯粹主义者可能不同意 ;-) 但是,如果它对您有帮助,请将 pronises 视为回调

标签: angularjs


【解决方案1】:

您可以为响应数据添加观察者。我认为在您的情况下是EntityId。 它会在您的 EntityId 更改后立即执行。得到响应数据后就可以调用函数了,这次EntityId不会是undefined了。

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

【讨论】:

    【解决方案2】:

    没错,你必须使用 Promise,因为 $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/'
      });
    

    【讨论】:

    【解决方案3】:

    你应该使用延迟。 在GetGroupIdFromBakery方法中新建一个defer对象,成功部分解决defer,失败部分拒绝,最后返回defer的promise。

    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 在服务中,我将它传递给方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 2017-11-19
      • 2016-04-30
      • 2021-08-28
      相关资源
      最近更新 更多