简体   繁体   English

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

[英]AJAX threading - how to wait for it to complete?

I'm wondering how can I make my script wait for AJAX to complete: 我想知道如何让我的脚本等待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');
}

When AJAX returns TRUE (or FALSE) the if(urlExists(src)) always says test2 ... I bet it's because it's not waiting for AJAX to complete? 当AJAX返回TRUE(或FALSE)时, if(urlExists(src))总是说test2 ...我打赌它是因为它不等待AJAX​​完成? But what does this do then? 但这又是什么呢? Why it's like that? 为什么会这样? I get test2 and soon after that ajax successs . 我得到了test2 ,很快就得到了ajax successs I need it to display test message. 我需要它来显示test消息。 Can someone explain me that? 有人可以解释一下吗?

The AJAX function returns TRUE or FALSE 100% alright. AJAX函数返回TRUE或FALSE 100%正常。

No. It always returns false , as stated in its last line. 不会。它总是返回false ,如最后一行所述。

how to wait for it to complete? 如何等待它完成?

You can't "wait" in terms of "sleeping", as it is an asynchronsous task. 你不能在“睡觉”方面“等待”,因为这是一项异步任务。 You will need to use a callback. 您将需要使用回调。 With jQuery's Deferreds, it looks like this: 使用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

This happens because AJAX is aynchronous, meaning the AJAX call is made and execution continues without waiting for the response to come back. 这是因为AJAX是异步的,这意味着进行了AJAX调用并继续执行而不等待响应返回。 Thats why your urlExists () executes before the response comes. 这就是你的urlExists ()在响应到来之前执行的原因。 To call it after the response has arrived call in the success handler like so: 要在响应到达后调用它,请调用成功处理程序,如下所示:

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. */

You could make your request asynchronous, however i do not suggest it. 您可以使您的请求异步,但我不建议。 It will result in a poor user experience any time the network or server doesn't respond quickly. 只要网络或服务器没有快速响应,就会导致糟糕的用户体验。

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

The recommended way is to instead use deferred objects or callbacks. 建议的方法是使用延迟对象或回调。 Below is an example using deferreds. 以下是使用延迟的示例。

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

also note though if you are testing for the existence of a cross-domain url, this will always fail. 另请注意,如果您正在测试是否存在跨域URL,则始终会失败。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM