为什么以下代码返回undefined
以防返回应为true
?我该怎么办?
<input type="text" value="" class="ticket_code">
function ticket_check() {
var val = 'ticket_code=' + $('.ticket_code').val();
var input_val = $('.ticket_code').val();
$.ajax({
type: "POST",
url: 'get_ticket_code',
data: val,
cache: false,
success: function (data) {
var result = true;
if (data != 0) {
$('div').empty().hide().fadeIn('slow').append(data + '<input name="name_ticket_code" value="' + data + '" style="display: none;">');
} else {
if (input_val) {
$('div').fadeOut('slow', function () {
$(this).empty();
})
result = false;
}
}
return result
}
});
}
alert(ticket_check());
答案 0 :(得分:2)
因为您正在进行异步调用,所以当执行警报时,尚未返回任何内容。
您可以将async设置为false
$.ajax({
type: "POST",
url: 'get_ticket_code',
data: val,
async: false,
cache: false,
success: function (data) {
var result = true;
if (data != 0) {
$('div').empty().hide().fadeIn('slow').append(data + '<input name="name_ticket_code" value="' + data + '" style="display: none;">');
} else {
if (input_val) {
$('div').fadeOut('slow', function () {
$(this).empty();
})
result = false;
}
}
return result
}
});
但这会锁定浏览器。
更好的方法是根据ajax调用的esit继续“成功”函数的流程
答案 1 :(得分:2)
$ .ajax调用是异步的,你无法调用并从中获取返回值。首次调用ticket_check时,不会执行代码返回结果。
你的功能已经在操纵DOM,你想要实现什么?
答案 2 :(得分:1)
以下是实现目标的常用方法:创建某种“承诺”对象,该对象将由ticket_check()
返回:
function Promise() {
var callback = function() {};
this.onResult = function(result) {
callback(result);
}
this.complete = function(handler) {
callback = handler;
return this;
}
}
function ticket_check() {
var promise = new Promise();
// ...
$.ajax({
// ...
success: function (data) {
var result = true;
// ...
promise.onResult(result);
}
});
return promise;
}
这允许您调用这样的代码:
ticket_check()
.complete(window.alert);
答案 3 :(得分:0)
因为您在true
事件中返回false
(或$.ajax.success
),该事件在差异线程中运行(不是真正的步骤,而是像它一样)异步运行。当你结束main方法(作为主线程)时,没有什么可以返回的。通过在ajax调用中设置async:false
attr,您可以解决问题。更好的方法是创建一个委托来处理结果。