Показать сообщение отдельно
  #1 (permalink)  
Старый 10.02.2021, 22:42
Новичок на форуме
Отправить личное сообщение для asdffak Посмотреть профиль Найти все сообщения от asdffak
 
Регистрация: 17.01.2017
Сообщений: 7

Не могу разобраться с промисами
Только недавно сел разбираться с промисами, выглядит все довольно сложно и непонятно. Казалось бы только уловил суть, написал код в соответсвие со своим понимание, но не работает.
Точнее работает, но нет асинхронности.
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. Да, там ошибка в логике "Такой адрес зарегистрирован" будет появляться даже в случае, когда строка просто не является адресом электронной почты. Но это не влияет на описанную проблему.
Ответить с цитированием