AngularJS 一个控制器中的两个 http 获取问题
AngularJS two http get in one controller make problems
我在一个控制器中有两个 http GET,有时它可以工作,其中两个正在工作。有时只有一个 http Get 可以工作。有时会显示 none 个。
有什么建议吗?
}).controller("nextSidorAdminCtrl",
function($scope,$rootScope,$http,$location,$state) {
$http.get("/ShiftWeb/rest/admin/getallsettingtime")
.then(function(response) {
$scope.settingtimes = response.data;
});
$http.get("/ShiftWeb/rest/admin/nextsidor")
.then(function(response) {
$scope.nextsidor = response.data;
});
图片:
链接两个 $http.get 操作:
}).controller("nextSidorAdminCtrl",
function($scope,$rootScope,$http,$location,$state) {
$http.get("/ShiftWeb/rest/admin/getallsettingtime")
.then(function(response) {
$scope.settingtimes = response.data;
return $http.get("/ShiftWeb/rest/admin/nextsidor")
})
.then(function(response) {
$scope.nextsidor = response.data;
});
因为调用承诺的 .then
方法 returns 一个新的派生承诺,很容易创建承诺链。可以创建任意长度的链,并且由于一个 promise 可以用另一个 promise 解决(这将进一步延迟其解决),因此可以 pause/defer 在链中的任何点解决 promise。
有关详细信息,请参阅 AngularJS $q Service API Reference - chaining promises
解决这个问题最好的方法是使用async
在我看来,georgeawg 先生的回答中的问题是,如果 $http.get("/ShiftWeb/rest/admin/getallsettingtime")
将 return success
那么 $http.get("/ShiftWeb/rest/admin/nextsidor")
会被调用,否则不会被调用。
正如我在问题中看到的那样,两者都是独立的。
因此您需要遵循使用异步或类似方法的最佳方式。
因此您的代码将是:
var getAllAettingTime = function(cb) {
$http.get("/ShiftWeb/rest/admin/getallsettingtime")
.then(function(response) {
if(response.data){
$scope.settingtimes = response.data;
return cb(null,'OK');
}else{
return cb(null,'ERROR');
})
}
var nextSidor= function(cb) {
$http.get("/ShiftWeb/rest/admin/nextsidor")
.then(function(response) {
if(response.data){
$scope.nextsidor = response.data;
return cb(null,'OK');
}else{
return cb(null,'ERROR');
})
}
async.series([ getAllAettingTime, nextSidor], function(err, result) {
if (err){
/* Do what you want if err comes */
} else {
/* Do what you want if both HTTP come with success */
}
});
在上面的 async.series()
中,两个 HTTP 都将被调用,彼此之间没有任何依赖关系。
为了更好地理解,您需要学习 async npm module 并且必须在您的应用中安装。
我在一个控制器中有两个 http GET,有时它可以工作,其中两个正在工作。有时只有一个 http Get 可以工作。有时会显示 none 个。 有什么建议吗?
}).controller("nextSidorAdminCtrl",
function($scope,$rootScope,$http,$location,$state) {
$http.get("/ShiftWeb/rest/admin/getallsettingtime")
.then(function(response) {
$scope.settingtimes = response.data;
});
$http.get("/ShiftWeb/rest/admin/nextsidor")
.then(function(response) {
$scope.nextsidor = response.data;
});
图片:
链接两个 $http.get 操作:
}).controller("nextSidorAdminCtrl",
function($scope,$rootScope,$http,$location,$state) {
$http.get("/ShiftWeb/rest/admin/getallsettingtime")
.then(function(response) {
$scope.settingtimes = response.data;
return $http.get("/ShiftWeb/rest/admin/nextsidor")
})
.then(function(response) {
$scope.nextsidor = response.data;
});
因为调用承诺的 .then
方法 returns 一个新的派生承诺,很容易创建承诺链。可以创建任意长度的链,并且由于一个 promise 可以用另一个 promise 解决(这将进一步延迟其解决),因此可以 pause/defer 在链中的任何点解决 promise。
有关详细信息,请参阅 AngularJS $q Service API Reference - chaining promises
解决这个问题最好的方法是使用async
在我看来,georgeawg 先生的回答中的问题是,如果 $http.get("/ShiftWeb/rest/admin/getallsettingtime")
将 return success
那么 $http.get("/ShiftWeb/rest/admin/nextsidor")
会被调用,否则不会被调用。
正如我在问题中看到的那样,两者都是独立的。
因此您需要遵循使用异步或类似方法的最佳方式。
因此您的代码将是:
var getAllAettingTime = function(cb) {
$http.get("/ShiftWeb/rest/admin/getallsettingtime")
.then(function(response) {
if(response.data){
$scope.settingtimes = response.data;
return cb(null,'OK');
}else{
return cb(null,'ERROR');
})
}
var nextSidor= function(cb) {
$http.get("/ShiftWeb/rest/admin/nextsidor")
.then(function(response) {
if(response.data){
$scope.nextsidor = response.data;
return cb(null,'OK');
}else{
return cb(null,'ERROR');
})
}
async.series([ getAllAettingTime, nextSidor], function(err, result) {
if (err){
/* Do what you want if err comes */
} else {
/* Do what you want if both HTTP come with success */
}
});
在上面的 async.series()
中,两个 HTTP 都将被调用,彼此之间没有任何依赖关系。
为了更好地理解,您需要学习 async npm module 并且必须在您的应用中安装。