Только недавно сел разбираться с промисами, выглядит все довольно сложно и непонятно. Казалось бы только уловил суть, написал код в соответсвие со своим понимание, но не работает.
Точнее работает, но нет асинхронности.
function check(input) {
let err = true;
let email_promise = new Promise(function(resolve, reject) {
let xml = new XMLHttpRequest();
xml.open("POST", "script/LoginCheck.php", true);
xml.send();
xml.onreadystatechange = function() {
if (xml.readyState == 4 && xml.status == 200) {
let rm = /^[\w\.\d-_]+@[\w\.\d]+\.[\w\.\d]+$/i;
if (xml.responseText == true && rm.test(input.value)) resolve();
else reject();
}
}
});
email_promise.then(function() {
err = true;
},
function() {
err = false;
alert("Такой адрес электронной почты уже зарегистрирован");
});
return err;
}
По задумке этот кусок кода проверяет 1) Действительно ли значение в input является почтой, 2) Что такой адрес еще не зарегистрирован (проверка через запрос на LoginCheck.php).
И впринципе при однократном вызове (при заполнении соответствующего поля) все отрабатывает правильно. Однако дальше, при завершении регистрации, возникает проблема:
var registrationDATA = new FormData();
function Registration() {
let inputs = document.querySelectorAll("input");
let err = true;
for (let input of inputs) {
if (!check(input)) err = false;
else registrationDATA.set(input.name, input.value);
}
if (err) alert("Не все поля заполнены корректно");
}
Почему-то в последнем условии выполняется именно вариант else при чем промис отрабатывает так, словно работает синхронно (т.е. сначала завершается выполнение функции Registration, а затем появляется сообщение "Такой адрес уже зарегистрирован")
P.S. Аналогично пробовал реализовать вызов функции check через промис в последнем условии, но с тем же результатом.
var registrationDATA = new FormData();
function Registration() {
let inputs = document.querySelectorAll("input");
let err = true;
for (let input of inputs) {
let check_promise = new Promise(function(resolve, reject) {
if (!check(input)) resolve(true);
else registrationDATA.set(input.name, input.value);
});
check_promise.then(function(result) {err = result;});
}
if (err) alert("Не все поля заполнены корректно");
}
P.P.S. Да, там ошибка в логике "Такой адрес зарегистрирован" будет появляться даже в случае, когда строка просто не является адресом электронной почты. Но это не влияет на описанную проблему.