Да, получается $.when() не обеспечивает порядка выполнения обещаний. Последовательная загрузка скриптов, вроде работает правильно:
function getScripts(urls, done, fail) {
var chain = $.when();
$.each(urls, function (i, url) {
chain = chain.then(function () {
return $.getScript(url);
});
});
chain.then(done, fail);
}
getScripts(['1.js', '2.js', '3.js'], function () {
console.log('done:', 'all');
}, function (xhr, status) {
console.log('fail:', this.url, xhr.status, status);
});
/*
1.js "var js1 = 'js1'; console.log(js1);"
2.js "var js2 = 'js2'; console.log(js1, js2);"
3.js "var js3 = 'js3'; console.log(js1, js2, js3);"
output:
js1
js1 js2
js1 js2 js3
done: all
2.js "var js2 = 'js2'; console.log(js1, js2, js3);"
output:
js1
fail: 2.js?_=1528600631808 200 parsererror
*/