あなたが本当に探しているのは.pipeです(または1.8以降では、.thenが同じことを意味するように変更されたと思います)
要するに、パイプを使用すると、探している方法で promise をチェーンできます。コードは次のようになります (未テスト):
var files, scriptsLoaded;
files = [ 'first.js', 'second.js', 'third.js', 'fourth.js' ];
while( files.length ) {
(function() {
var currentUrl = files.shift();
scriptsLoaded = scriptsLoaded ?
scriptsLoaded.pipe(function() {
return $.getScript( currentUrl );
}) :
$.getScript( currentUrl );
}());
}
$.when( scriptsLoaded ).done(function() {
// All scripts are now loaded assuming none of them failed
});
** 編集 **
あなたが提供したそのリンクで、私はあなたが達成しようとしていたことを理解しています. これは、いくつかのコメントを含むソリューションの修正版です。他のソリューションと同じことを達成しますが、はるかに簡潔なバージョンです。
var files = [ 'first.js', 'second.js', 'third.js', 'fourth.js' ];
// The initial value provided to the reduce function is a promise
// that will resolve when the first file has been loaded. For each
// of the remaining file names in the array, pipe it through that first
// promise so that the files are loaded in sequence ( chained ).
// The value that is returned from the reduce function is a promise
// that will resolve only when the entire chain is done loading.
var scriptsLoaded = files.slice(1).reduce(function (soFar, file) {
return soFar.pipe(function() {
return $.getScript( file );
});
}, $.getScript( files[0] );