Надеюсь, это то, что вы имеете в виду: http://jsfiddle.net/pimvdb/hdN3Q/1/.
(function($) {
function load(files, index) {
var arr = [];
// fill arr with getScript requests (fake here)
for(var i = 0; i < files[index].length; i++) {
arr.push(console.log(files[index][i]));
}
// call $.when with arr as array of arguments (using apply)
$.when.apply(null, arr).then(function() {
if(index < files.length - 1) {
// if we have to move to the next chunk,
// load that next one
setTimeout(function() {
// timeout is to show they get processed in chunks
load(files, index + 1);
}, 1000);
}
});
}
$.loader = function(obj) {
load(obj.js, 0);
}
})(jQuery);
$.loader({
js: [
['1.js','3.js','2.js'],
['4.js'],
['5.js']
]
});
.apply
по сути делает то же самое, что и вызов функции. Однако, поскольку количество аргументов для $.when
различается в зависимости от ввода, вы не можете просто вызвать $.when(...)
, потому что у вас нет фиксированного количества аргументов. Для вызова функции с переменным количеством аргументов используется .apply
. Это работает так:
someFunction(1, 2, 3);
невероятно похож на:
someFunction.apply(null, [1, 2, 3]);
(null
относится к контексту выполнения, находящемуся вне области действия.) Самое замечательное в этом то, что вы можете создать массив любого размера. Таким образом, вы можете вызвать функцию с любым переменным количеством аргументов таким образом.
В функции load
arr
заполняется функциями getScript
и работает так же:
var arr = [getScript('file1'), getScript('file2')];
$.when.apply(null, arr);
невероятно похож на:
$.when(getScript('file1'), getScript('file2'));
В load
мы заполняем arr
файлами чанка, например, в вашем случае первый блок равен 1.js
, 3.js
и 2.js
. Это делается с помощью цикла for
, но массив, который вы в итоге получите, можно просто передать в .apply
.
Когда все файлы загружены, вызывается .then
. Функция, которую мы передаем туда, должна загружать следующий фрагмент, но только если равен следующему фрагменту. Если есть 3 блока, он должен перейти к следующему, когда index
равно 0
или 1
. Когда чанк 2
закончен, следующего чанка нет, поэтому он не должен переходить к следующему, так как следующего нет.
Итак, нам нужно это if
предложение:
if(index < files.length - 1) {
Скажите files.length
- это 3
. Тогда это if
условие будет проходить только тогда, когда index
равно 0
или 1
, что мы и хотим.