这是我的代码:
function validateField(field, input) {
if (field && input) {
$.ajax({
type: 'POST',
url: '<?php echo site_url("ajax/verify"); ?>',
dataType: 'json',
data: { 'field' : field, 'input' : input},
success: function(result) {
var available = result.available;
if (available == 1) {
// return true (for the entire function);
}
}
});
}
return false;
}
答案 0 :(得分:6)
现在最正确的做法是使用$.Deferred
:
function validateField(field, input) {
if (field && input) {
return $.ajax({
type: 'POST',
url: '<?php echo site_url("ajax/verify"); ?>',
dataType: 'json',
data: { 'field' : field, 'input' : input}
}).pipe(function(result) {
var available = result.available;
return available == 1;
});
}
return $.Deferred().resolve(false);
}
validateField('somefield', 'someinput')
.done(function(result) {
if (result) {
alert('it is true');
} else {
alert('it is false');
}
});
基于回调的解决方案(我不喜欢它; - ):
function validateField(field, input, callback) {
var cb = $.isFunction(callback) ? callback : $.noop;
if (field && input) {
$.ajax({
type: 'POST',
url: '<?php echo site_url("ajax/verify"); ?>',
dataType: 'json',
data: { 'field' : field, 'input' : input},
success: function(result) {
var available = result.available;
cb(available == 1);
}
});
return;
}
cb(false);
}
validateField('somefield', 'someinput', function(result) {
if (result) {
alert('it is true');
} else {
alert('it is false');
}
});
答案 1 :(得分:1)
执行此操作的唯一方法是使请求同步(async: false
)并在成功函数内切换外部作用域中的布尔变量的值。 这不推荐,甚至不支持jQuery 1.8。 Ajax基于回调模式,如果满足某些条件则触发某些功能。如果有效的话,在ajax回调的成功函数中做任何事情会更好。
function validateField(field, input, success) {
var valid = false;
if (field && input) {
$.ajax({
type: 'POST',
async: false,
url: '<?php echo site_url("ajax/verify"); ?>',
dataType: 'json',
data: { 'field' : field, 'input' : input},
success: function(result) {
var available = result.available;
if (available == 1) {
// return true (for the entire function);
valid = true;
// BETTER TO CALL doSomethingIfValid(); here
}
}
});
}
return valid;
}