基本上,我使用JS验证注册表单,步骤之一是检查是否已使用用户名。我不知道如何在继续之前等待响应。我不想使用async:false。
这里是代码。现在,checkUsername始终返回validate()。
// check in DB if username is already taken
function isUsernameTaken(username) {
$.ajax({
type: "POST",
url: "/checkUsername/",
data: {
username: username,
},
success: function (response) {
if (response.type == "taken") {
return true;
} else {
return false;
}
},
error: function (xhr, errmsg, err) {
console.log(xhr.status + ": " + xhr.responseText);
return false;
},
});
}
// run checks
function checkUsername() {
const input = usernameInput;
const inputVal = input.val().trim();
if (isUsernameTaken(inputVal)) {
console.log("Username taken");
invalidate(input, "Username taken");
return;
} else {
console.log("validate");
validate(input);
}
}
jQuery的$.ajax
方法(和别名)都返回一个
deferred对象,该对象也是一个promise-like对象,因此其想法是return以便其他代码可以使用它来等待。
例如function isUsernameTaken(username) {
return $.post("/checkUsername/", { username })
.then(({ type }) => type === 'taken', (jqXHR, textStatus, errorThrown) => {
console.error(textStatus, errorThrown)
return false
})
}
这将返回一个以布尔值解析的promise。然后,您将像这样使用它
isUsernameTaken(inputVal).then(isTaken => { if (isTaken) { console.log("Username taken") invalidate(input, "Username taken") } else { console.log("validate") validate(input) } })