2012-12-06 160 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