$.ajaxを使用してcss/js / jst(javascriptテンプレート)をロードするこのコードがあり、リクエストの後にリクエストを実行し、一度に1つだけ実行し、非同期で実行するようにしたいと思います。
var getStuff = function(resources, progressCallback, errorCallback, successCallback, doneCallback){
var deferreds = [];
var deferreds_progressCallback = [];
var len = resources.length;
for(var idx = 0; idx < len; idx++){
var resource = resources[idx];
var dfd = jQuery.Deferred(function(self){
self.notify(resource);
(function(resource){
jQuery.ajax({
cache: false,
url: resource,
dataType: 'text',
error: function(xhr, status, error){
self.reject(resource);
},
success: function(data, status, xhr){
if(typeof(data) != 'string'){
console.log(typeof(data));
}
if(resource.match(/.css$/)){
$('head').append("<style type='text/css'>" + data + "</style>");
}else if(resource.match(/.jst$/)){
var templates_div = jQuery("<div style='display:none;'></div>").appendTo('body');
templates_div.append(data);
}else if(resource.match(/.js$/)){
jQuery.globalEval(data);
}
self.resolve(resource);
}
});
})(resource);
});
deferreds.push(dfd);
deferreds_progressCallback.push(resource);
}
deferreds.reverse();
deferreds_progressCallback.reverse();
(function iterateWhen(){
if(len--){
jQuery.when(deferreds[len])
.then(function(resource){
successCallback(resource);
iterateWhen();
})
.fail(function(resource){
errorCallback(resource);
})
.progress(function(resource){
progressCallback(resource);
});
}else{
doneCallback && doneCallback();
}
}());
}
現在、そのコードは起動時にすべてのリクエストを実行します。deferred.resolve()が呼び出されるのを待ちますが、iterateWhen()ループがdeferreds[]の反復を開始するのを待ちません。
jQueryのドキュメントによると、$。Deferred()はオプションの引数として関数を受け入れ、コンストラクターから戻る前にその関数を実行するので、それが問題ですが、私は自分が望むことを実行するソリューションを知りません。
よろしく!