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 successstestメッセージを表示するために必要です。誰かが私にそれを説明できますか?

4

3 に答える 3

2

AJAX 関数は、TRUE または FALSE を 100% 正常に返します。

いいえfalse。最後の行に記載されているように、常に を返します。

それが完了するのを待つ方法は?

非同期タスクであるため、「スリープ」に関して「待機」することはできません。コールバックを使用する必要があります。jQuery の Deferred を使用すると、次のようになります。

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

推奨される方法は、代わりに遅延オブジェクトまたはコールバックを使用することです。以下は deferred を使用した例です。

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 に答える