0

私のアプリケーションは、4 つのスレッドしか持たないサーバー (Baracudda サーバーなど) に対して同時 AJAX 非同期呼び出しを行います。同時 AJAX 非同期呼び出しを順次非同期呼び出しに変換する必要があります。jQuery内にそれを行うメカニズムはありますか? 提案してください。

コード:

function initiateAJAXRequest() {
    var promise = $.ajax({
        type: queue[0].options.type,
        url: queue[0].options.url,
        timeout: queue[0].options.timeout || 3000,
        cache: (!queue[0].options.cache) ? queue[0].options.cache : true,
        dataType: queue[0].options.dataType,
        data: queue[0].options.data         
    }).promise();


    promise.then(function(result) {
        console.log(queue[0]);  
        // I get an error in the line below: "xhr is undefined".
        queue[0].dfd.resolve(result);
        queue.splice(0, 1);
        if(queue.length > 0) {
            queue[0].isActiveRequest = true;
            initiateAJAXRequest();
        }
    });

    promise.fail(function(xhr, statusText, message) {
        queue[0].dfd.reject(arguments);
        queue.splice(0, 1);             
        if(queue.length > 0) {
            queue[0].isActiveRequest = true;                    
            initiateAJAXRequest();
        }
    });
}

function callAJAXAsync(options) {
    // Create deferred object. This will manage the promise chain who calls this method.
    var deferred = new $.Deferred();


    window.queue.push({dfd: deferred, options: options});
    window.queue = queue;

    if(!window.queue[0].isActiveRequest) {
        window.queue[0].isActiveRequest = true;             
        initiateAJAXRequest();
    }
    return deferred.promise();
};

これは、アプリケーションのフレームワーク用に作成したコードです。1 つのページで callAJAXAsync() メソッドを複数回呼び出すことができます。問題は、initiateAJAXRequest() 内のコメント行でエラーが発生することです。

EDIT 私を襲ったことの1つは、callAJAXAsync()メソッド内で新しい遅延オブジェクトを作成し、initiateAJAXRequest()メソッド内で解決/拒否していることです。それは有効ですか?

解決策 このコードは正常に動作します。エラーは別の理由によるものでした。念のため作成したフィドルは次のとおりです... http://jsfiddle.net/LnaPt/

4

3 に答える 3

3

それらが本当にシーケンシャルである必要がある場合、それぞれの応答ハンドラーは単純に次のハンドラーを呼び出すことができます。このようなもの:

$.ajax({
    // options for the first call
}).done(function() {
    $.ajax({
        // options for the second call
    }).done(function () {
        // and so on
    });
});
于 2013-10-11T14:58:46.797 に答える
0

このコードは正常に動作します。エラーは別の理由によるものでした。私のクエリに投稿されたフィドルを確認できます。

于 2013-12-30T14:19:10.137 に答える
-1

url: queue[0].options.url,使用できるようになった後async: false,

async: true,jQuery AJAX のデフォルトの動作です

于 2013-10-11T16:15:50.360 に答える