Сообщение от asdffak
|
Это что, получается мне нужно будет все кейсы оборачивать во внутренний промис?
|
Как бы да.
Но для этого существуют асинхронные функции (async/await)
Функция объявленная async всегда возвращает промис. Если ей в return указать промис, она его и вернет. А если какое то другое значение, то она обернет его в Promise.resolve(value)
await получает промис, ждет его разрешение и вытаскивает значение, которое было передано через resolve. Неудобно только, что значение переданное через reject так не получить. поэтому их приходится ловить с помощью try{} catch. Но через reject лучше передавать настоящие ошибки.
Ваш код можно переписать так
async function check(input) {
let err = true;
switch(input.name) {
case "email":
return 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(true);
else resolve (false);
}
}
xml.onerror = function() { reject () }
});
.then(function(err) {
if (err) alert("Такой адрес электронной почты уже зарегистрирован");
return err
}
);
break;
case "..."
if(...) ...;
else err = false;
break
case "..."
break;
......
return err;
}
var registrationDATA = new FormData();
async function Registration() {
let inputs = document.querySelectorAll("input");
let err = false;
for (let input of inputs) {
err = await check(input)
if (err) break;
registrationDATA.set(input.name, input.value);
}
if (err) alert("Не все поля заполнены корректно");
}
// Вызов Registration
try {
await Registration()
catch () {
alert("Ошибка соединения с сервером");
}