我想知道如何让我的脚本等待AJAX完成:
function urlExists(testUrl){
var ajaxurl = 'some AJAX URL';
jQuery.ajax({
type: "POST",
url: ajaxurl,
data: {
"action": "somefunction",
"content": testUrl
},
global: false,
success: function(){
alert('ajax successs');
return true;
},
error: function(){
return false;
}
});
return false;
}
/* The AJAX function returns TRUE or FALSE 100% alright. */
/* The interesting part begins below. */
if(urlExists(src)){
alert('test');
}else{
alert('test2');
}
当AJAX返回TRUE(或FALSE)时,if(urlExists(src))
总是说test2
...我打赌是因为它不等待AJAX完成?但这又是什么呢?为什么会这样?我得到test2
并在ajax successs
之后不久。我需要它来显示test
消息。有人可以解释一下吗?
答案 0 :(得分:2)
AJAX函数返回TRUE或FALSE 100%。
没有。它总是返回false
,如最后一行所述。
如何等待它完成?
你不能在“休眠”方面“等待”,因为它是一个异步任务。您将需要使用回调。使用jQuery的Deferreds,它看起来像这样:
function urlExists(testUrl){
return jQuery.ajax({
type: "POST",
url: 'some AJAX URL',
data: {
"action": "somefunction",
"content": testUrl
},
global: false,
success: function(){
alert('ajax successs');
}
});
}
urlExists(src).done(function(){
alert('test');
}).fail(function(){
alert('test2');
}); // returns the promise immediately, but will alert later on
答案 1 :(得分:1)
这是因为AJAX是异步的,这意味着进行了AJAX调用并继续执行而不等待响应返回。这就是你的urlExists
()在响应到来之前执行的原因。要在响应到达后调用它,请调用成功处理程序,如下所示:
function urlExists(testUrl){
var ajaxurl = 'some AJAX URL';
jQuery.ajax({
type: "POST",
url: ajaxurl,
data: {
"action": "somefunction",
"content": testUrl
},
global: false,
success: function(){
alert('ajax successs');
if(urlExists(src)){
alert('test');
}else{
alert('test2');
}
return true;
},
error: function(){
return false;
}
});
return false;
}
/* The AJAX function returns TRUE or FALSE 100% alright. */
/* The interesting part begins below. */
答案 2 :(得分:1)
您可以使您的请求异步,但我不建议。只要网络或服务器没有快速响应,就会导致用户体验不佳。
function urlExists(testUrl){
var result;
var ajaxurl = 'some AJAX URL';
jQuery.ajax({
type: "POST",
url: ajaxurl,
async: false, // BAD
data: {
"action": "somefunction",
"content": testUrl
},
global: false,
success: function(){
alert('ajax successs');
result = true;
},
error: function(){
result = false;
}
});
return result;
}
if(urlExists(src)){
alert('test');
}else{
alert('test2');
}
推荐的方法是改为使用延迟对象或回调。以下是使用延迟的示例。
function urlExists(testUrl){
var ajaxurl = 'some AJAX URL';
return jQuery.ajax({
type: "POST",
url: ajaxurl,
data: {
"action": "somefunction",
"content": testUrl
},
global: false
});
}
urlExists(src).done(function(){
alert('test');
}).fail(function(){
alert('test2');
});
还要注意,如果您正在测试是否存在跨域网址,这将始终失败。