1

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

4

3 回答 3

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
于 2012-12-19T18:39:57.970 回答
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. */
于 2012-12-19T18:40:40.933 回答
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');
});

另请注意,如果您正在测试是否存在跨域 url,这将始终失败。

于 2012-12-19T18:42:01.357 回答