我目前的情况是,我正在对包含$ 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(
无论如何我可以添加一些功能来检查这两个调用是否都已完成,如果是,设置一个变量来捕获范围内的这个? 感谢
答案 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);
});