2012-10-18 90 views
0

我有一個函數加載一個部分。如何嵌套jQuery .when調用回調?

function loadSection(sectionId, onLoaded) { 
    $.when(
     loadTemplate(sectionId), 
     // etc 
    ) 
    .then(function() { 
     // removed for brevity 
    } 
} 

loadTemplate功能我淡出當前模板和淡出後,我加載新的模板。

function loadTemplate(sectionId) { 
    // Fade out current template. 
    return $content.fadeOut(function() { 
     // After fade out, load new template via ajax. 
     $.ajax({ 
      url: settings.apiUrl + 'GetSectionTemplate', 
      data: { sectionId: sectionId }, 
      type: 'post', 
      success: function (template) { 
       // Add new content and fade in new template. 
       $content 
        .html(template) 
        .fadeIn(); 
      } 
     }); 
    }); 
} 

的問題是$.when只有等待淡出功能,在移動之前完成。我需要它等待fadeOut和ajax調用完成,但我需要ajax調用才能在fadeOut完成後執行。

+0

如果你'返回$阿賈克斯({});'? – Ian

+1

@ianpgall返回從fadeOut回調函數返回。我試過了。它不能解決任何問題。 – Chev

+1

您的loadTemplate函數需要參與延遲/承諾的世界。 – jfriend00

回答

2

創建一個延遲對象,返回,然後當AJAX完成解決它:

function loadTemplate(sectionId) { 
    var deferred = $.Deferred(); 
    $content.fadeOut(function() { 
     $.ajax({ 
      url: settings.apiUrl + 'GetSectionTemplate', 
      data: { sectionId: sectionId }, 
      type: 'post', 
      success: function (template) { 
       $content.html(template).fadeIn(); 
       deferred.resolve(); 
      } 
     }); 
    }); 
    return deferred; 
} 
+1

MAD項目給你好先生! – Chev

-1

試着讓你的Ajax調用同步:

$.ajax({ 
    async: false, 
    url: settings.apiUrl + 'GetSectionTemplate', 
    ... 
    ... 
+1

通過強制fadeOut的回調成爲一個同步動作,它*可能是一個「修復」,但肯定有更好的解決方法。 –

+0

@FabrícioMatté是的,它屬於「醜陋的黑客」類別,但有時這些是唯一的方式,並沒有說明是這種情況。 – Nelson

+1

這很可能是最糟糕的解決方案。 – jAndy

1

只需使用一個Array無極對象爲並返回。像

function loadTemplate(sectionId) { 
    var promises = [ ]; 

    // Fade out current template. 
    promises.push($content.fadeOut()); 
    promises.push($.ajax({ 
     url: settings.apiUrl + 'GetSectionTemplate', 
     data: { sectionId: sectionId }, 
     type: 'post', 
     success: function (template) { 
      // Add new content and fade in new template. 
      $content 
       .html(template) 
       .fadeIn(); 
     } 
    })); 

    return promises; 
} 

,然後調用它像

$.when.apply(null, 
    loadTemplate(sectionId) 
).then(function() { 
}); 

如果您需要更多的控制權的承諾,對象的順序解決,或者你想攔截/過濾器的效果,你也可以使用.pipe()有所concat的承諾。

+0

'loadTemplate(sectionId)'後面的',// etc'是什麼?你已經提供了一個包含'.when'所有參數的數組,不是嗎? –

+0

@FabrícioMatté:複製並粘貼失敗。 – jAndy

+0

噢,好吧,真棒答案+1'=]' –