2016-12-29 3 views
0

$.when()と一緒に、配列に可変長の遅延関数を使用しようとしています。これらの関数は、サーバーからデータをフェッチし、DOMでレンダリングします。これらの作業がすべて完了すると、いくつかのスクリプトがロードされ、いくつかのポストロードアクションが実行されます。ここで

は、私が使用していますものです:

function loadAllGames(updateGames, updatePlayoffs) { 
    var deferredLoads = []; 
    if (updateGames !== false) 
     deferredLoads.push($.Deferred(loadGames)); 

    if (updatePlayoffs !== false) 
     deferredLoads.push($.Deferred(loadPlayoffs)); 

    $.when.apply($, deferredLoads).done(loadPostGamesLoadData); 
} 

問題がloadPostGamesLoadDataが呼び出されないされないことです。

両方loadGamesloadPlayoffsリターンの約束:

function loadGames() { 
    $.get('{% url wave_spinner_template %}', {message: 'Loading games...'}, function (data) { 
     $('#weeks').html(data); 
    }); 

    return $.ajax({ 
     url: "{% url weeks season.id %}", 
     success: function (data) { 
      $('#weeks').html(data); 
     }, 
     error: function() { 
      console.log("Error loading games."); 
     } 
    }); 
} 

function loadPlayoffs() { 
    $.get('{% url wave_spinner_template %}', {message: 'Loading playoffs...'}, function (data) { 
     $('#playoffs').html(data).children('.spinner-container').addClass('border-top'); 
    }); 

    return $.ajax({ 
     url: "{% url playoffs season.id %}", 
     success: function (data) { 
      var $playoffs = $('#playoffs'); 
      if (!$playoffs.length) { 
       $playoffs = $('<div>', {id: 'playoffs'}); 
       $('#weeks').after($playoffs); 
      } 
      $playoffs.html(data); 
     }, 
     error: function() { 
      console.log("Error loading playoffs."); 
     } 
    }); 
} 
+0

返さ全く約束はありません。 – Jai

+0

それは '$ .ajax'を返しています。私が見たすべての例は、約束を返すためにこれを使用していました。代わりに私は何をすべきですか? – dabadaba

+0

将来、完全に別の質問をするのではなく、かなり不完全だった以前の質問を編集してください。あなたはいつでもあなたの質問を修正するために "編集"リンクを使用することができます。 – jfriend00

答えて

0

遅延オブジェクトを間違って作成しています。確かに、それらをまったく作成すべきではありません。 $.Deferredが受け入れる関数は、新しい遅延オブジェクトを引数として受け取る(ハンドラをアタッチすることができる)ので、$.Deferredの直前に実行されるファクトリ関数です。 (Details in the API docs.)これは、loadGamesのようなものではありません。彼らはを返しますは、遅延オブジェクトです。だからあなたは決して決して退屈な物では終わりません。

彼らはすでにだけで直接これらの機能を使用し、あなたが戻っている$.ajaxからオブジェクトを、延期しているので:

function loadAllGames(updateGames, updatePlayoffs) { 
    var deferredLoads = []; 
    if (updateGames !== false) 
     deferredLoads.push(loadGames()); 
// ------------------------^^^^^^^^^^^ 

    if (updatePlayoffs !== false) 
     deferredLoads.push(loadPlayoffs()); 
// ------------------------^^^^^^^^^^^^^^ 

    $.when.apply($, deferredLoads).done(loadPostGamesLoadData); 
} 
1

$.ajaxがすでに延期を返すよう、Deferredのコールをドロップします。

function loadAllGames(updateGames, updatePlayoffs) { 
    var deferredLoads = []; 
    if (updateGames !== false) 
     deferredLoads.push(loadGames()); 

    if (updatePlayoffs !== false) 
     deferredLoads.push(loadPlayoffs()); 

    $.when.apply($, deferredLoads).done(loadPostGamesLoadData); 
} 
関連する問題