AJAX线程 - 如何等待它完成?

时间:2012-12-19 18:33:39

标签: javascript jquery ajax

我想知道如何让我的脚本等待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消息。有人可以解释一下吗?

3 个答案:

答案 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');
});

还要注意,如果您正在测试是否存在跨域网址,这将始终失败。