2016-12-29 52 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',我看到的所有例子都用它來返回promise。我應該怎麼做呢? – 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

刪除該Deferred通話,$.ajax已經返回推遲。

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

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

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