我有一个API调用,它将响应一个列表,并且我想为每个错误显示一个对话框,但是我希望在我对第一个错误按“是”后显示下一个对话框。我该如何处理?因为现在,即使没有选择的答案,它也会继续循环。
我已经尝试过此Link的答案,但对我没有用。
还有其他处理方式吗?
timeSheetApi
.validate(clonedTimesheet)
.then(function (resp) {
var validationErrors = resp.data;
line.ErrorCount = 0;
line.WarningCount = 0;
line.Errors = "";
if (validationErrors.length > 0) {
line.ErrorCount = validationErrors.length;
validationErrors.forEach(detail,index){
let confirm = $mdDialog.confirm()
.title('')
.htmlContent(detail.Message)
.ok('Yes')
.cancel('No');
$mdDialog.show(confirm).then(function(){
//yes
//i want the loop to wait for this yes
}, function(){
//no
// and exit this loop if no was selected
});
}
line.Errors = cleanErrorMessage(line.Errors);
triggerOption(sourceColumn, prop, index, val, time_field);
return line;
}).catch(function (err) {
exceptionService.resolve(err);
});
答案 0 :(得分:1)
您将不得不避免在循环中显示对话框。显然,到脚本运行时,循环将遍历所有验证错误,并且对于每个此类错误,您将在循环中创建的每个对话框中调用show
。这就是为什么脚本完成时会显示多个对话框的原因。
您可以做的是,只有在上一个对话框关闭后才能创建并显示每个对话框。观察脚本的修改版本,在该脚本中,我坚持处理错误并显示对话框,而不是遍历验证错误(使用forEach
),并在关闭该对话框后继续处理下一个错误,重复使用相同的validationErrors
数组:
timeSheetApi
.validate(clonedTimesheet)
.then(function (resp) {
var validationErrors = resp.data;
line.ErrorCount = 0;
line.WarningCount = 0;
line.Errors = "";
function process_next_error() {
const next_error = validationErrors.shift();
if(!next_error) return; /// No more validation errors
let confirm = $mdDialog.confirm()
.title('')
.htmlContent(timesheetError.Message)
.ok('Yes')
.cancel('No');
$mdDialog.show(confirm).then(process_next_error);
}
process_next_error();
line.Errors = cleanErrorMessage(line.Errors);
triggerOption(sourceColumn, prop, index, val, time_field);
return line;
}).catch(function (err) {
exceptionService.resolve(err);
});
上面的“ handler”函数是process_next_error
函数-它是脚本最初直接调用以处理第一个错误的函数,也是脚本用作show(confirm)
的回调的函数许诺,它将在关闭对话框时解决。
如果没有其他错误,process_next_error
只会返回,什么也不做。
validationErrors
数组在上一个对话框关闭时将为空,这是因为我逐渐从中“移出”项目。我认为这不是问题,因为可以告诉我validationErrors
在您的应用程序中是一个非常短暂的变量。如果要保留最初在validationErrors
数组中的元素,则可以对其进行复制,也可以对其进行遍历,而不使用shift
。
答案 1 :(得分:0)
您应该在那里使用await并使用简单的for循环。 Foreach循环接受一个回调,并且您在其中收到了Promise,所以它不存在。
答案 2 :(得分:0)
我认为您应该不使用forEach
重新编码。这是demo,您可以在其中循环使用每个元素,而无需使用forEach
。