Показать сообщение отдельно
  #4 (permalink)  
Старый 11.02.2021, 08:01
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,775

Сообщение от 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("Ошибка соединения с сервером");
}
Ответить с цитированием