Инструкции после выполнения условия IF перед выполнением блока IF

#jquery

#jquery

Вопрос:

У меня есть строки, которые нужно удалить, деактивировать или пометить как прочитанные. Теперь для удаления и деактивации я показываю предупреждение в модальном окне bootbox, в то время как «пометить как прочитанное» не требует предупреждения. Есть три кнопки, которые запускаются с именем класса mass :

 $('.mass').click(function(e){
    e.preventDefault();
    var action = $(this).attr("data-action");

    // see action and warn as necessary.
    var goon = false; // decided to use goon to see if execution should continue or not, after my attempts without it failed
    if (action == 'delete') {
        //warn
        bootbox.confirm('Sure Delete?' function(choice) {
            goon = choice; //will be false or true
        });
    } else if (action == 'deactivate') {
        bootbox.confirm('Deactivate?', function(choice) {
            goon = choice;
        });
    } else { // we don't need warning
        goon = true;    
    }

    alert(goon); // to see
    if (goon == false) {
        return false;
    }
    //continue to server processing her
});
  

Теперь проблема в том, что alert(goon) запускается до / при отображении модального окна перед щелчком cancel или ok . Это всегда false . Весь if блок, похоже, не имеет никакого эффекта. После нажатия кнопки Отмена или Ок он больше не запускается, потому что процесс уже выполнен.

Чего мне не хватает, пожалуйста?

Ответ №1:

Ваша логика ошибочна, поскольку вы ничего не делаете с возвращаемым значением из bootbox. Вместо этого вы немедленно проверяете goon (который всегда будет находиться в состоянии по умолчанию false ) и продолжаете.

Чтобы исправить это, вы можете извлечь свою логику в функцию, которая вызывается только при взаимодействии с bootbox. Попробуй это:

 $('.mass').click(function(e){
    e.preventDefault();
    var action = $(this).attr("data-action"); 

    if (action == 'delete') {
        bootbox.confirm('Sure Delete?' function(choice) {
           choice amp;amp; performAction(action);                
        });
    } else if (action == 'deactivate') {
        bootbox.confirm('Deactivate?', function(choice) {
           choice amp;amp; performAction(action);   
        });
    } else {
        performAction(action);  
    }
});

function performAction(action) {
    // continue to server processing her
}
  

Комментарии:

1. Спасибо. Я никогда не знал этого способа. новичок, большое спасибо. Попробуем и посмотрим, что произойдет.

Ответ №2:

никогда не использовал bootbox, но из их документации:http://bootboxjs.com/documentation.html

 bootbox.alert("Your message here…", function(){ /* your callback code */ })
  

javascript является асинхронным, ваш код не «ожидает» перед выполнением.

Я думаю, что вы хотите сделать, это переместить IF в блок обратного вызова. таким образом, оно будет оценено при закрытии предупреждения.