Как ждать, пока одна функция не завершится и не зациклится
Это часть моего кода:
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();
}
})