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

Javascript AJAX线程-如何等待它完成?,javascript,jquery,ajax,Javascript,Jquery,Ajax,我想知道如何让我的脚本等待AJAX完成: function urlExists(testUrl){ var ajaxurl = 'some AJAX URL'; jQuery.ajax({ type: "POST", url: ajaxurl, data: { "action": "somefunction", "content": testUrl

我想知道如何让我的脚本等待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时,ifurlExistssrc总是说test2。。。我打赌这是因为它没有等待AJAX完成?但这又有什么用呢?为什么会这样?我得到了test2,不久之后ajax就成功了。我需要它来显示测试消息。有人能给我解释一下吗

AJAX函数100%正确地返回TRUE或FALSE

否。它总是返回false,如最后一行所述

如何等待它完成

您不能等待睡眠,因为这是一项异步任务。您将需要使用回调。对于jQuery的延迟,它看起来是这样的:

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
AJAX函数100%正确地返回TRUE或FALSE

否。它总是返回false,如最后一行所述

如何等待它完成

您不能等待睡眠,因为这是一项异步任务。您将需要使用回调。对于jQuery的延迟,它看起来是这样的:

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

这是因为AJAX是异步的,这意味着进行AJAX调用并继续执行,而无需等待响应返回。这就是为什么您的URL在响应到来之前执行。要在响应到达后调用它,请在成功处理程序中调用,如下所示:

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

这是因为AJAX是异步的,这意味着进行AJAX调用并继续执行,而无需等待响应返回。这就是为什么您的URL在响应到来之前执行。要在响应到达后调用它,请在成功处理程序中调用,如下所示:

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

您可以使您的请求异步,但我不建议这样做。当网络或服务器不能快速响应时,这将导致糟糕的用户体验

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,则此操作将始终失败。

您可以使请求异步,但我不建议这样做。当网络或服务器不能快速响应时,这将导致糟糕的用户体验

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,则此操作将始终失败。

在成功函数中测试url是否存在。根据定义,AJAX是异步的,因此js不会等待结果。相反,请使用成功回调。AJAX是异步的。稍后将调用成功处理程序……您还可以通过在请求的配置中传递async:false使任何ajax请求异步。如果您不想这样做,请按照@JonathanM的建议执行:在成功回调中执行您希望等待ajax请求结果的代码。请不要使用async:false。总有更好的办法。从一个有着错误做法伤痕的人身上拿走测试成功函数中是否存在url。根据定义,AJAX是异步的,因此js不会等待结果。相反,请使用成功回调。AJAX是异步的。稍后将调用成功处理程序……您还可以通过在请求的配置中传递async:false使任何ajax请求异步。如果您不想这样做,请按照@JonathanM的建议执行:在成功回调中执行您希望等待ajax请求结果的代码。请不要使用async:false。总有更好的办法。从一个有着错误做法伤痕的人身上拿走第二个示例仍然显示async:false。需要编辑并删除它。第二个示例仍然显示async:false。需要对其进行编辑并删除。感谢您的解释!由于某些原因,urlExistssrc返回JS错误-未定义函数。我在同一个范围内使用它,所以我不确定会发生什么。然而,我在成功回调中成功地实现了它:感谢您的解释!由于某些原因,urlExistssrc返回JS错误-未定义函数。我在同一个范围内使用它,所以我不确定会发生什么。但是,我成功地使其在成功回调中工作: