1

我遇到了Bootstrap Dialog的一个非常奇怪的行为 由于某种原因,在foo下面提供的功能中,对话框没有立即显示。渲染延迟到到达线路的那一刻$.get(...。任何想法为什么会发生这种情况?

function = foo()
{
   $rows.each(function (i, row) 
   {
       var $row = $(row);
       if (something_is_wrong()) 
       {
           alert_error('Something is wrong', $form, '');
           return;
       }
       // Some other code           
    });
    // The Bootstrap modal dialog shows up when reaching the point below !!!
    $.get('/sending_order_notification/' + legal_entity_own_id, function(response)
    {
        BootstrapDialog.show({ ...
        // ...
     });
}


function alert_error(message, $current_form, function_name)
{
    if ($current_form != undefined)
        $current_form.modal('hide');

    BootstrapDialog.show(
    {
        type: BootstrapDialog.TYPE_DANGER,
        title: 'Ошибка',
        message: message,
        draggable: true,
        buttons: [{
            label: 'OK',
            action: function(dialogItself) {
                dialogItself.close();
                if (function_name != undefined)
                    $.post('/send_error_report/', function_name);
            }
        }]
    });  
}

更新 受 Maximus 的 anwser 启发,我选择了以下对我有用的解决方法。然而,这不是一个干净的解决方案,因为即使它变得毫无意义,我也必须继续循环。

function = foo()
    {
       var bad_condition_flg = false;
       $rows.each(function (i, row) 
       {
           var $row = $(row);
           if (something_is_wrong()) 
           {
               bad_condition_flg = true;
           }
           // Some other code           
        });
        if (bad_condition_flg);
        {
           alert_errr(...);  
           return;
         }
     }
4

1 回答 1

1

为了显示对话框,浏览器必须执行重绘。仅当调用堆栈中没有任何内容时,才可以重新绘制。所以对话框只有在执行完成后才会显示foo。使用调试器时有点不同,因为有时在断点处停止会给浏览器重新绘制的时间,并且对话框可能会在调用堆栈为空之前显示。

于 2016-10-15T10:23:57.193 回答