Как ждать, пока одна функция не завершится и не зациклится

Это часть моего кода:

document.querySelector("#edit_<?= $row["item_id"]; ?>").addEventListener("submit", function(a){
    if(!completed){
        a.preventDefault();
    }else{
        return true;
    }

    if((function(){
        alertify.prompt("New Amount of Item : ", function(e, str){
            if(e){
                document.querySelector("#edit_<?= $row["item_id"]; ?> input[name=\"item_amount\"]").value = str;
                var completed = true;
                return true;
            }else{
                return false;
            }
        })
    )() == true){
        document.querySelector("#edit_<?= $row["item_id"]; ?>").submit();
    }
});

куда <? $row["item_id"]; ?> вернет что-то (игнорируйте это, это не настоящая проблема)

Но проблема в том, что мне нужно подождать, пока alertify.prompt() получает str а затем положить его

document.querySelector("#edit_<?= $row["item_id"]; ?> input[name=\"item_amount\"")

(Извините за этот грязный код)

Что я могу сделать, чтобы решить это?

PS Лучше не использовать решение jQuery, если это возможно, потому что оно уже дано. Используйте решение Javascript-Only, пожалуйста.

4 ответа

Решение

Удалить второй if состояние и просто использовать alertify функция обратного вызова:

// define the completed variable outside the callbacks
var completed = false;
document.querySelector("#edit_<?= $row["item_id"]; ?>").addEventListener("submit", function(a){
    if(!completed){
        a.preventDefault();
    }else{
        return true;
    }
    alertify.prompt("New Amount of Item : ", function(e, str){
        if(e){
            document.querySelector("#edit_<?= $row["item_id"]; ?> input[name=\"item_amount\"]").value = str;
            //no var before completed, because then it would be local to this callback function
            completed = true;
            // here instead returning "true" do what you wanted to do if true
            document.querySelector("#edit_<?= $row["item_id"]; ?>").submit();
        }
    });
});

Не смешивайте javascript(клиент) и php(сервер) напрямую, чтобы передать данные от клиента к серверу или от сервера к клиенту, вы можете использовать ajax

Функция подсказки получает функцию обратного вызова, которая будет выполнена после получения текста. Вы можете продолжить свою логику там

alertify.prompt("Message", function (e, str) { // str is the input text if (e) { // user clicked "ok" } else { // user clicked "cancel" } }, "Default Value");

ПРИМЕЧАНИЕ: взято из примеров оповещения

prompt Метод является асинхронным, поэтому обратный вызов будет вызван после выхода из внешней функции. Отправьте форму от обратного вызова:

alertify.prompt("New Amount of Item : ", function(e, str){
  if(e){
    completed = true; // note: no "var"
    var f = document.querySelector("#edit_<?= $row["item_id"]; ?>");
    document.querySelector("input[name=\"item_amount\"]", f).value = str;
    f.submit();
  }
})
Другие вопросы по тегам