我正在验证包含用户配置文件信息的表单,并且希望与我的服务器一起检查用户指定的用户名是否已被使用。我已经定义了一个验证方法,如下所示:为什么我的验证ajax调用延迟整个验证方法?
$.validator.addMethod(
'check_username',
function(value, element, param) {
console.log('starting');
var name_is_in_use = 0;
// Start the throbber.
$('form#user-profile-form input#edit-name').addClass('searching');
// Hit the server and see if this name is already in use by someone else.
$.ajax({
url: '/checkusername/' + value + '/" . $form['#user']->uid . "',
dataType: 'json',
data: {},
async: false,
success:
function(data) {
console.log('back from the server');
name_is_in_use = data; // unnecessary, but whatever
// Kill the throbber
$('form#user-profile-form input#edit-name').removeClass('searching');
},
});
return name_is_in_use;
},
'Sorry, but this username is already in use.');
总的来说,验证过程起作用;我遇到的麻烦是在输入字段上连接一个“忙碌”的悸动者以正常工作 - 悸动者永远不会从其正常状态变为忙碌状态。但是,在服务器上添加一些sleep()调用以夸大实际发生的情况后,我所看到的是这两个console.log语句同时出现在控制台中 - 在调用服务器之后已经完成。这就解释了为什么我没有看到跳动的变化 - .searching
类在添加后立即被删除。但我不明白的是,为什么我没有看到我在想什么应该要发生的事情:
- 我点击浏览器领域火验证方法。
console.log('starting')
显示在控制台中- 跳动者打开。
- 有一个暂停,而服务器被调用,睡了一下, 返回其值,
console.log('back')
显示了在该活动指示器被关闭控制台- 。
相反,我得到这个(忽略活动指示器类的变化):
- 我点击浏览器领域火验证方法。
- 有一个暂停,而服务器被调用,睡了一下, 返回其值,
console.log('starting')
显示了在控制台,然后,无延迟,console.log('back')
在控制台中显示出来
步骤3和4几乎同时发生。
我对此非常疑惑 - 看起来整个执行程序被ajax调用阻止了,这对我来说根本毫无意义。任何人都可以提供一些见解吗?谢谢!
'async:false'应该是'async:true' - 更多地阅读这个设置。异步设置为false会使请求异步。 http://api.jquery.com/jQuery.ajax/ – Pebbl 2013-02-26 23:31:30
请参阅:http://stackoverflow.com/a/13579061/594235 – Sparky 2013-02-27 00:13:03