我有一个函数和几个$ http获取请求。我需要在执行每个$ http请求后调用另一个函数。但它总是在请求完成之前执行该功能。是什么原因?有办法解决吗?
$scope.json=function(){
$scope.loading = true;
$http.get(DataElementUrl).then(function (response) {
if (!response.data == "")
dataElementJson = response.data;
});
$http.get(categoryComboUrl).then(function (response) {
if (!response.data == "")
categoryComboJson = response.data;
});
$http.get(categoryUrl).then(function (response) {
if (!response.data == "")
categoryJson = response.data;
});
check++;
$scope.getJson();
};
答案 0 :(得分:9)
您可以使用$ q'所有':
var a = $http.get(DataElementUrl).then(function (response) {
if (!response.data == "")
dataElementJson = response.data;
});
var b = $http.get(categoryComboUrl).then(function (response) {
if (!response.data == "")
categoryComboJson = response.data;
});
var c = $http.get(categoryUrl).then(function (response) {
if (!response.data == "")
categoryJson = response.data;
});
$q.all([a, b,c]).then(function(result) {
check++;
$scope.getJson();
});
答案 1 :(得分:4)
这种情况正在发生,因为javascript中的网络调用是异步的。你应该做什么看看角度提供的q服务。这是一个承诺库。
如果你想在所有3个完成时调用一个方法,你需要使用的是
.all([promise1, promise2], fulfilled, rejected)
当满足数组中的所有promise时,它将调用已完成的回调。
答案 2 :(得分:2)
我会像这样使用$ q.all():
$scope.json=function(){
$scope.loading = true;
var promises = [$http.get(DataElementUrl),
$http.get(categoryComboUrl),
$http.get(categoryUrl)]
$q.all(promises).then(function(results){
dataElementJson = results[0].data,
categoryComboJson = results[1].data,
categoryJson = results[2].data
});
};