如何使循环等待回调成功
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);
}
});
}
- $scope.chartscoreval.push :将对象推入数组时,但它只包含最后一个对象。
- $scope.checkwithfor:在我得到获取方法循环成功完成的结果之前。
使用承诺
对于 vanilla JavaScript (ECMAScript 5),没有直接的方法可以强制事件循环等待特定的异步调用。但是,如果您确实需要等待异步调用完成,请继续,请使用 Promise。
Promise 将被集成到 ECMAScript 6 中
但是有一些库可以为您提供承诺功能。其中之一是"promisejs":(您可以选择任何其他方法,它们被实现为遵循相同的标准。
https://www.promisejs.org/
此外,您需要调整您的 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 循环。 有了这个,你可以在承诺后立即重复调用一个函数 通过
fulfill()
确认done
信号。因此,流程大致如下所示:
checkEvl(0) ⇒ checkwithfor() ⇒ fulfill() ⇒ then() ⇒checkEvl(1) ⇒ ...
相关文章:
- 成功回调永远不会被JSONP请求调用
- 查询后websql成功回调无法访问变量
- 在$q服务中捕获拒绝而不触发成功回调
- 如何从ajax成功回调函数中读取javascript变量
- bookmarklet中的jQuery.getScript()进行回调,但没有成功执行插件
- $http服务未触发成功或错误回调
- 在AJAX中使用window.location.replace'成功'回调
- AJAX成功回调-执行javascript时出现问题
- 当使用命名函数作为jquery ajax成功回调时,我需要括号吗
- jQuery$.post可以在chrome、safari中工作,但不能在FF中工作(声明成功回调函数未定义)
- Yii ajaxbutton : 如何在成功回调函数中获取 $(this)
- 角承诺的“then”函数的成功回调的词汇范围是什么?
- 解析查询.首次成功/错误 间歇性不调用回调
- 承诺中的成功回调不会发生$http
- AJAX内部回调成功
- AJAX 的回调(成功?)函数
- 流星:从服务器回调成功后写入数据库
- 回调成功后,不能将字符串推入数组
- Ajax, post数据但不回调成功
- 如何使循环等待回调成功