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