我需要一种方法来使用回调来获取不同的脚本。 这种方法可行:
fetchScripts:function() {
var _this=this;
$.when(
$.ajax({
url:_this.url + 'library/script-one.js',
type:'get',
cache:true
}),
$.ajax({
url:_this.url + 'library/script-two.js',
type:'get',
cache:true
}),
{ .... },
$.ajax({
url:_this.url + 'library/script-n.js',
type:'get',
cache:true
})
).then(function() {
console.log('fetch is done');
})
},
但我想更加概括该方法,因为冗余正在增加。 是否有可能将承诺传递给$ .when()? 在我的第一次尝试之下 - 但是url总是相同的,即'script-n.js' 也许我错过了这一点,你可以说明一个更“美”的解决方案
fetchScripts:function() {
this.deferred=new $.Deferred();
this.promise=this.deferred.promise();
var _this=this;
$.each([
'script-one.js',
'script-two.js',
( .... ),
'script-n.js'
],function() {
_this.script=this;
_this.promise.then(function(){
return $.ajax({
url:_this.url + 'library/' + _this.script,
type:'get',
cache:true
})
});
});
$.when(
this.promise
).then(function() {
console.log('fetch is done');
});
this.deferred.resolve();
},
答案 0 :(得分:28)
你还需要$ .when。但相反,创建一个Deferreds(或promises)数组,然后apply创建$ .when:
fetchScripts:function() {
var base = this.url;
var defaults = {
type:'get',
cache:true
};
var libraries = [
'library/script-one.js',
'library/script-two.js',
'library/script-n.js'
];
var deferreds = $.map(libraries, function(current) {
var ajaxOptions = $.extend({ url: base + current }, defaults);
return $.ajax(ajaxOptions);
});
$.when.apply($, deferreds).then(function() {
console.log('All done');
});
}
除了扩展默认设置外,您还可以使用$.ajax(defaults)。
答案 1 :(得分:4)
尝试
fetchScripts: function() {
var deferred = new $.Deferred();
var _this=this;
var promises = $.map([
'script-one.js',
'script-two.js',
( .... ),
'script-n.js'
], function(item, idx) {
return $.ajax({
url:_this.url + 'library/' + item.script,
type:'get',
cache:true
})
});
$.when.apply($, promises).then(function() {
console.log('fetch is done');
deferred.resolve()
});
return deferred.promise();
}