AngularJS检查几个$ http获取请求的结果

时间:2017-05-03 19:31:10

标签: angularjs http

我正在使用Angular 1.6.3

我需要提出3个请求,最后检查是否至少有一个成功响应。现在我写了这段代码:

         var result = new Array();
         $http.get("link1",
                {
                    "params": {
                        "email": user.email,
                    }
                }).then(function (successResult) {
                result[0] = false;
            }, function (errorResult) {
                result[0] = true;
            });
            $http.get("link2",
                {
                    "params": {
                        "email": user.email,
                    }
                }).then(function (successResult) {

                result[1] = false;

            }, function (errorResult) {

                result[1] = true;

            });
            $http.get("link3",
                {
                    "params": {
                        "email": user.email,
                    }
                }).then(function (successResult) {
                result[2] = false;
            }, function (errorResult) {
                result[2] = true;
            });
            if(result[0] || result[1] || result[2]){
                error();
            }

但有时,GET个请求中的一个会在-1提供200作为Http状态代码时返回$http。我知道所有<%= image_tag listing.listing_property_details.images.first, class: "fancy-border" %> 请求都是异步的,我认为这是主要原因。解决这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

这样做的正确方法是使用$ q.all

使用以下代码。

var promise1 = $http.get("link1",
        {
            "params": {
                "email": user.email,
            }
        });
var promise2 = $http.get("link2",
        {
            "params": {
                "email": user.email,
            }
        });
var promise3 = $http.get("link3",
        {
            "params": {
                "email": user.email,
            }
        });

$q.all([
         promise1,
         promise2,
         promise3
       ]).then(function(data) 
       {

          // data[0] contains the response of the promise1 call
          // data[1] contains the promise2 response
          //  data[2] contains the promise3 response.
           $scope.variable = data;
       },
       function(errorData){

       });

答案 1 :(得分:1)

你可以像这样使用

var result = new Array();
 $http.get("link1",
        {
            "params": {
                "email": user.email,
            }
        }).then(function (successResult) {
        result[0] = false;
    }, function (errorResult) {
        result[0] = true;
    }).then($http.get("link2",
        {
            "params": {
                "email": user.email,
            }
        }).then(function (successResult) {

        result[1] = false;

    }, function (errorResult) {

        result[1] = true;

    })).then(
    $http.get("link3",
        {
            "params": {
                "email": user.email,
            }
        }).then(function (successResult) {
        result[2] = false;
    }, function (errorResult) {
        result[2] = true;
    }));

但是这里有一个更好的方法是与诺言打电话 这是官方网站的链接

https://docs.angularjs.org/api/ng/service/$http

答案 2 :(得分:0)

由于HTTP请求的异步性质,您可以更好地正确使用promises。我建议Promise.all()可以在收到回复后检查回复的状态。

或者,您可以使用函数检查每个响应是否到达(而不是等待所有承诺解析)。

例如:

checkResponse(res) {
  // logic here
}

$http.get('xxx').then(res => checkResponse(res))
$http.get('yyy').then(res => checkResponse(res))
$http.get('zzz').then(res => checkResponse(res))