【发布时间】:2014-05-19 20:16:49
【问题描述】:
对于此类问题的百万次迭代,我深表歉意。我已经看到许多其他帖子都在讨论这个问题,但我仍然无法在回调成功并返回后调用函数。这篇文章我一定读了六遍以上:
How do I return the response from an asynchronous call?
代码
无论如何..,我的问题希望任何人都可以阐明。我有一个自定义的 jQuery 验证器方法来检查用户名是否可用。
jQuery.validator.addMethod("usernameAvailability",
function(value, element) {
console.log('starting usernameAvailability');
if(this.optional(element) === true){return true;}
else{
console.log('ending usernameAvailability, about to return get_availability');
return availabilityCheck.get_availability('username');
}
}, "Username already in use." );
自定义 jQuery 验证器方法调用命名空间可用性检查中的 get_availability(element)。
var availabilityCheck = (function() {
var usernameIsAvailable, emailIsAvailable, Callback, AJAX_Availability_Check, change_Availability;
usernameIsAvailable = null;
emailIsAvailable = null;
AJAX_Availability_Check = function(callback, element){
console.log('starting AJAX_Availability_Check');
if(element==="username"){
selection = {username:$('#id_username').val()};
}
else{
selection = {email:$('#id_email').val()};
}
$.ajax({
url: '/register/',
type: 'get',
data: selection,
dataType:'text',
async: true
}).done(Callback(element));
};
change_Availability = function(element, bool) {
if(element === 'username'){
usernameIsAvailable = bool;
}
else{
emailIsAvailable = bool;
}
};
Callback = function(element) {
return function(result, textStatus){
bool = result === "True" ? true: false;
change_Availability(element, bool);
return usernameIsAvailable;
};
};
return{
get_availability: function(element){
AJAX_Availability_Check(Callback, element);
return element === 'username' ? usernameIsAvailable : emailIsAvailable;
}
}
})();
问题和我的问题
我的问题 输入正确地验证了用户名是否已被使用,但用户需要触发验证两次,因为 get_availability 在回调可以将 usernameIsAvailable 更改为正确的布尔值之前返回。
我的问题如何重构我的代码,以便回调调用我的自定义 jQuery 验证方法?或者我如何确保它在回调返回之前不会验证?
【问题讨论】:
-
嗯,很简单:不可能从 AJAX 同步返回
true/false给验证器。如果您的jQuery.validator不支持异步验证,那么您就不走运(获得更好的插件),如果支持,请联系其文档。
标签: javascript jquery ajax validation