2016-12-29 7 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 반환 약속 : $.ajax 이미 연기 반환로

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

에서, Deferred 호출을 삭제합니다.

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

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

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