2

任意の数のスクリプトを実行する必要があります。次のものは、前のものがロードおよび実行されたもののみを実行できます。RequireJS (および関連) が正しい選択であることはわかっていますが、promise について学習しようとしているので、これが私の実験です。

var files = [
  'first.js',
  'second.js',
  'third.js',
  'fourth.js'
];

var funcs = files.map(function(file) {
  return function() { return $.getScript(file); }
});

var deferred = $.Deferred();

funcs.reduce(function (soFar, f) {
   return soFar.then(f);
}, deferred.resolve(funcs[0])); 

誰かが私のソリューションの落とし穴と代替案について詳しく説明できますか?

4

1 に答える 1

1

あなたが本当に探しているのは.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] ); 
于 2012-10-26T19:39:02.123 に答える