我有一个JS函数-checkUsername-包括一个Ajax调用。它可以验证表单输入,还可以在提交表单时验证相同的输入:
function checkUsername(id) {
var userName = $('#' + id).val().trim();
if(!userName) {
showErr(id, 'An entry is required.');
return Promise.resolve(false);
}
return $.ajax({
type: 'POST',
data:{'checkUsername': userName},
url:'/php/ajax/validation-ajax.php',
})
.then(function(response) {
if(response == 'notfound') {
showErr(id, 'This user is not in the list.');
return(false);
}
else {
clearErr(id);
return(true);
}
})
.fail(function(err) {
// some code
})
}
在第一种情况下,由事件处理程序调用。在第二部分中,它构成switch语句的一部分:
case 'username':
checkUsername(id).then(function(data) {
if(isOK && data !== false) {
// submit form
$('form#adminusers').submit();
}
});
break;
在表单提交的情况下,我认为功能诺言已得到正确处理。但是大概是当事件处理程序调用该函数时,promise仍然悬而未决。
这有关系吗?即使我编写了该函数的两个版本,一个用于事件处理程序,另一个用于表单提交,事件处理程序版本仍将在其中进行Ajax调用,因此Promise的情况也不会有所不同。
处理这种情况的正确方法是什么?
答案 0 :(得分:0)
要视情况而定。
最重要的部分是您完全兑现承诺。通常,当您找到未解决的承诺时,您真正的意思是错误状态没有得到解决。在您的特殊情况下,在switch语句中,看起来好像“良好”状态是通过提交表单来解决的,但是如果checkUsername
或表单提交引发了任何错误,它将抛出未解决的拒绝。
最终,您应始终使用.fail()
或.catch()
-取决于您使用的Promises实现-在任何Promise链的末尾捕获在链中任何地方出现的错误。您可以有多个..在您的情况下,您在.fail()
中有checkUsername()
,可以用false
解决该函数的承诺,但是您应该有另一个最后,以防万一表单提交中抛出任何错误。
答案 1 :(得分:0)
我认为在您的情况下,checkUsername(id)
函数使用了已经解决所有承诺的ajax。因此,返回ajax将仅返回将执行的每个函数(如成功或失败)的return语句。所有的承诺都只在那里解决。
但是在switch
语句的情况下,您正在对根本不返回诺言的函数调用诺言。即checkUsername(id).then(function(data) {});
在使用该函数之前,您首先必须确保该函数返回一个Promise。
因此,您的checkUsername(id)
应该返回承诺:
checkUsername(id){
return new Promise((resolve, reject) => {
// do something here
});
}