2012-12-06 210 views
1

我想在jQuery調用ajax調用後做一些操作。jQuery ajax異步調用

我已經看到,如果我使用這樣的功能:

function DownloadData() { 
     $.ajax({ 
      url: "/api/AlbumsRest", 
      accepts: "application/json", 
      cache: false, 
      success: function() { 
       /*binding stuff*/ 
      }, 
      error: function (XMLHttpRequest, textStatus, errorThrown) { 
       alert('Error' + textStatus); 
      } 
     }); 
    } 

Ajax請求它在異步模式下完成的。我不想改變它,因爲我不想凍結頁面。但是我想在這個Ajax完成之後做一些動作(動畫,效果等)。

所以,我的問題是,我怎麼能知道,如果我在此請求結束,而無需使用成功事件

如果我叫DownloadData功能是這樣的:

function DownloadNextData() { 
     DownloadData(); 
     SlideOutAnimation(); 
     SlideInAnimation(); 
    } 

我需要在異步請求完成後製作幻燈片。

有些想法?

+0

您是否嘗試過完成,而不是成功 –

+0

文檔@SridharNarasimhan'complete'爲成功和失敗完成(和也已過時) – Alnitak

+0

爲什麼沒有成功的回調? – eveevans

回答

4

使用jQuery Deferred Objects你應該從DownloadData

function DownloadData() { 
    return $.ajax({...}); 
} 

return$.ajax()結果,然後您可以將您的AJAX的處理程序一旦AJAX調用已經完成了就只能得到所謂的外註冊的函數:

function DownloadNextData() { 
    DownloadData().done(function() { 
     SlideOutAnimation(); 
     SlideInAnimation(); 
    }); 
} 

注視 - 您的動畫處理與您的AJAX功能完全分離:)

爲了簡化問題,.done也可以採取實際的函數引用列表:

function DownloadNextData() { 
    DownloadData().done(SlideOutAnimation, SlideInAnimation); 
} 

注意,在這種情況下,您不能提供自己的函數參數 - 它們就會得到通過AJAX的內容數據。

+0

非常感謝,That works –

2
function DownloadData() { 
    return $.ajax({ 
     url: "/api/AlbumsRest", 
     accepts: "application/json" 
    }); 
} 

function DownloadNextData() { 
    SlideOutAnimation(); 
    SlideInAnimation(); 
} 

DownloadData().done(DownloadNextData); 
+0

爲什麼你會在'DownloadNextData'裏面放置'DownloadData'? – Alnitak

+0

@Alnitak - 我從問題中的代碼假設它只是再次調用ajax函數,但我可能會誤解?其實我想我現在得到它,然後我將它刪除! – adeneo