Строка 22 return err;
будет выполняться синхронно и всегда возвращать true
Асинхронно будут выполняться только функции в стр. 15-17 в случае успеха и 18-21 в случае ошибки.
В асинхронном программировании приходится делать асинхронным все, что зависит от первой асинхронной операции
Поэтому функция chek должна возвращать не конкретное значение, а свой промис
function check(input) {
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();
else reject();
}
}
})
.then(
function() {
return true;
},
function() {
alert("Такой адрес электронной почты уже зарегистрирован");
return false
}
);
}
и вызывать ее
check(input).then (function (result) {/*result будет true или false */})
Или в асинхронной функции
let result = await check(input)
/*result будет true или false тут его обрабатываем*/