等待确认,然后循环ForEach

时间:2019-06-17 08:31:49

标签: javascript foreach

我有一个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);
            });

3 个答案:

答案 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