等待所有$ http调用在Angular中完成

时间:2015-01-15 11:29:49

标签: angularjs asynchronous

我目前的情况是,我正在对包含$ http调用(异步)的服务进行两次调用,并且使用延迟等待并在两次调用返回后设置范围数据。这工作正常,但是,一旦两个调用完成(成功或失败),我现在需要设置一个变量,并且我不确定如何进行此操作。

这是我的代码:

//"use strict";

(function() {
var friendsController = function($scope, $log, friendsService)
{
    // prepare the $scope
    $scope.friendsData = {
        community: window.community,
        userId: 'someuser',
        friends: {},
        requests: {},
        requestsUtil : {
            dataLoad : true,
            dataSucc : false,
            dataErr : false
        },
        friendsUtil : {
            dataLoad: true,
            dataSucc: false,
            dataErr: false
        },
        dataLoad: true,
        dataSucc: false,
        dataLoadDone: false
    };

    // util
    var setStatus = function(stringType, load, succ, err) {//
         $scope.friendsData[stringType].dataLoad = load;
         $scope.friendsData[stringType].dataSucc = succ;
         $scope.friendsData[stringType].dataErr = err;
    }

    // get initial request data
    friendsService.getRequests(window.user.bpUser.display_name)
        .then(
            // success
            function(data) {
                if(data.friendRequests.length) {
                    $scope.friendsData.requests = data;
                    setStatus("requestsUtil", false, true, false);
                } else {
                    setStatus("requestsUtil", false, false, true);
                }

        },
            // error
            function(data, status, headers, config) {
                $log.log(data.error + ' ' + status);
                setStatus("requestsUtil", false, false, true);
        });

    // get initial friends data
    friendsService.getFriends(window.user.bpUser.display_name)
        .then(
            // success
            function(data) {
                if(data.friends.length) {
                    $scope.friendsData.friends = data;
                    setStatus("friendsUtil", false, true, false);
                } else {
                    setStatus("friendsUtil", false, false, true);
                }

        },
            // error
            function(data, status, headers, config) {
                $log.log(data.error + ' ' + status);
                setStatus("friendsUtil", false, false, true);
                scope.friendsData.loadDone = true;
        });

    $scope.friendsData.dataLoad = false;
    $scope.friendsData.dataSucc = true;
};

Profile.controller('profile.friendsController', ['$scope', '$log', 'friendsService',    friendsController]);
})();

如你所见,我的两个要求是:

friendsService.getRequests(window.user.bpUser.display_name)
        .then(

friendsService.getFriends(window.user.bpUser.display_name)
        .then(

无论如何我可以添加一些功能来检查这两个调用是否都已完成,如果是,设置一个变量来捕获范围内的这个? 感谢

2 个答案:

答案 0 :(得分:1)

您可以使用$ q.all()方法

var promises = [];
promises.push(friendsService.getRequests(window.user.bpUser.display_name));
promises.push(friendsService.getFriends(window.user.bpUser.display_name));
$q.all(promises).then(function (results) { 
    doSomethingOnThem(results[0], results[1]);
});

答案 1 :(得分:0)

您可以使用$q.all。这样的事情(我对错误部分不太确定):

$q.all([friendsService.getRequests(window.user.bpUser.display_name), 
       friendsService.getFriends(window.user.bpUser.display_name)])
.then(
    // success
    function(data) {
      if(data[0].friendRequests.length) {
         $scope.friendsData.requests = data[0];
         setStatus("requestsUtil", false, true, false);
      } else {
        setStatus("requestsUtil", false, false, true);
      }

      if(data[1].friends.length) {
         $scope.friendsData.friends = data;
         setStatus("friendsUtil", false, true, false);
      } else {
         setStatus("friendsUtil", false, false, true);
      }
    },
    // error
    function(error) {
       $log.log(error + ' ' + status);
       setStatus("requestsUtil", false, false, true);
       setStatus("friendsUtil", false, false, true);
    });