jQueryのajax非同期通信を順番付けするAjax Queueプラグインにハマる

AJAXロゴ

jQueryのeach内で$.postを使ってたんだけど、返ってくるタイミングがバラバラで困る。

調べてみるとajax通信に順番付けするプラグインAjax Queueの存在を知ったのだが動かない。

 

プラグインを使わない解決方法

どうやらjQueryのバージョンに依存しているようで、1.3以前と1.5以降の物は見つかるが肝心の1.4のがない。jQueryのバージョンは訳あって変更したくないので、結局プラグインに頼まずに、

jQueryでajax:非同期通信時、実行順番を保障する方法 « Kinopyo Blog

で紹介されているコードで対応できた。どのバージョンでも使えそうだからAjax Queueプラグインより優秀な気がする。下がちょっとだけカスタマイズしたコードです。使う場合は単純に関数をコピペして、

function doOrderGuaranteedAjax(ajaxOptionArray, allCompleteHandler){
    var defaults = {
        complete : function() {
            ajaxOptionArray.shift();
            if (ajaxOptionArray.length == 0 ) {
                if (allCompleteHandler) {
                    allCompleteHandler();
                }
            } else {
                option = ajaxOptionArray[0];
                opts = $.extend({}, defaults, option);
                $.ajax(opts);
            };
        }
    };

    var option = ajaxOptionArray[0];
    var opts = $.extend({}, defaults, option);
    $.ajax(opts);
};

適当な配列に$.ajaxの内容をプッシュして最後に関数を呼び出せばOK。 第2引数では全てのキューが終わった時のfunction()を指定できます。

var optionArray = [];
optionArray.push({
    type: 'post',
    url: 'http://example.com/',
    data: {
        'key':'value'
    },
    success: function(data){
        alert( data );
    }
});
doOrderGuaranteedAjax(optionArray);

 

参考

jQueryバージョン 1.3以前

AjaxQueue and jQuery 1.3 | onemoretake
Ajax Queue Plugin — Gist

jQueryバージョン 1.5以降

jQuery.ajaxQueue – A queue for ajax requests — Gist