2013-07-11 12 views
7

コールバックを使用して別のスクリプトを取得するメソッドが必要です。 この方法がうまく動作:

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'); 

    }) 
}, 

が、私はredundanyが増加しているため、より多くの方法を一般化したいと思います。 $ .when()に約束を伝えることは可能ですか?私の最初の試みの下 - しかし、URLは常に同じである、すなわち「スクリプト-n.js」 は、たぶん私はポイントを逃し、あなたはまだ$ .whenが必要

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(); 
}, 

答えて

27

より「美しさ」ソリューションを説明することができ。しかし、その代わりに、$ .whenにそれをDeferredの作り方(または約束)の配列を作成し、apply

また
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)を使用することができます。

+0

あなたは.then' 'に渡された匿名関数の内部' arguments'マジック変数を使用することができます延期値の結果にアクセスしてみてください。 –

+0

私は、then()を使用したときにリクエストが失敗した場合、すべて完了していないにもかかわらずその関数を入力するのに対し、done()では最後のものが終了したときにのみ実行され、どんなに失敗したとしても。 –

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(); 
} 
+0

私はあなたが '$。each'ではなく' $ .map'を意味すると思います。 'item.script'ではなく' item'だけでも:-) –

+0

@RocketHazmatはい、コピー貼り間違い –

関連する問題