![](/img/trans.png)
[英]How to make for loop wait until Async call was successful before to continue
[英]How to make for loop wait until callback was successful?
$scope.checkwithfor = function(evlappsub){
if( evlappsub != "" && typeof evlappsub !="undefined"){
var s = serviceDomain + '/catanalysisdb/' + evlappsub;
$http.get(s).success(function(data3){
$scope.chartscore.name = data3.keyattributes.appName;
$scope.chartscore.y = (data3.keyattributes.totalAffinity * -1);
$scope.chartscoreval.push($scope.chartscore);
});
}
}
var serviceDomain = "url";
if(evaluation_id !== ''){
$http.get(serviceDomain + '/catanalysisdb/' + evaluation_id).success(function(data) {
var evl_id = data.form.mainFields[8].fieldTypeVal;
for(var i=0;i<evl_id.length;i++){
var evljsonsum_ib = evl_id[i].value;
evlappsub = "cat_sub_key_val_"+evljsonsum_ib.split("_")[1];
$scope.checkwithfor(evlappsub);
}
});
}
使用承诺
使用香草JavaScript(ECMAScript 5),没有直接方法强制事件循环等待特定的异步调用。 但是,如果您确实需要等待异步调用完成,然后继续,请使用Promise 。
Promise将被集成到ECMAScript 6中
但是有些库可以为您提供Promise功能。 其中之一是“ promisejs” :(您可以选择其他任何一个,它们的实现都遵循相同的标准。)
另外,您需要调整for循环
要链接承诺以强制异步功能在继续执行之前完成,您需要修改for循环以使此任务成为可能。
$scope.checkwithfor = function(evlappsub){
return new Promise(function(fulfill,reject){
if( evlappsub != "" && typeof evlappsub !="undefined"){
var s = serviceDomain + '/catanalysisdb/' + evlappsub;
$http.get(s).success(function(data3){
$scope.chartscore.name = data3.keyattributes.appName;
$scope.chartscore.y = (data3.keyattributes.totalAffinity * -1);
$scope.chartscoreval.push($scope.chartscore);
fulfill(); // SIGNIFY IT'S DONE!
});
}
});
}
var serviceDomain = "url";
if(evaluation_id !== ''){
$http.get(serviceDomain + '/catanalysisdb/' + evaluation_id).success(function(data) {
var evl_id = data.form.mainFields[8].fieldTypeVal;
// FORMER LOOP ACTION
function checkEvl(i){
if (i<evl_id.length){
var evljsonsum_ib = evl_id[i].value;
evlappsub = "cat_sub_key_val_"+evljsonsum_ib.split("_")[1];
$scope.checkwithfor(evlappsub).then(function(){
// AFTER FINISH, CALL THE NEXT EVL
checkEvl(i+1);
});
}
}
checkEvl(0); // STARTS OFF WITH THE FIRST ELEMENT
});
}
补充说明
您需要用递归函数代替for循环 。 这样,您可以在promise通过
fulfill()
确认done
信号后立即重复调用函数。因此,处理流程大致如下 :
checkEvl(0)⇒checkwithfor()⇒履行()⇒then()⇒checkEvl(1)⇒...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.