重用jQuery.post()/ jQuery.Deferred()对象

我正在寻找的最简单的例子是:

var messageLoader = $.post("api/user/messages", {api:data}) messageLoader.done(function(data){ //do something }); 

这项工作非常出色,但只有一次。 如果我想更新数据,我必须重新定义所有内容。

我似乎无法找到任何延迟对象的调用,让我重新启动它。 即messageLoader.redo() ,理想情况下会重新执行POST请求,然后调用相同的“完成”处理程序,而不必重新定义它。

我可以将它全部放在一个函数中并简单地再次调用该函数,但这不是我正在寻找的,因为我还想要这样做:

 var messageLoader = $.post("api/user/messages", {api:data}) var friendRequestLoader = $.post("api/user/friendrequests", {api:data}) $.when(messagesLoader, friendRequestLoader) .done(function (messages, friendRequests) { // update display of messages and friend requests // attach Handlers }); $("#updateMessages").click(function(){ messageLoader.redo() // This doesn't exist }) 

想法是单击$("#updateMessages")会重新执行该请求,然后$.when()处理程序将使用新的messageLoader数据和原始的friendRequestLoader数据。

我已经查看了类似这样的文档,但没有找到任何东西。 也许这里有人知道它是否存在,或者是一种完成同样事情的方法。

我很确定Deferred类不是按照你想要的方式工作,因为它们是一次性使用对象。 我甚至参加了jQueryConf上Deferreds的整个会议,并且甚至没有提到重新使用它们。

此外,您可以从Deferred API页面中看到:

 http://api.jquery.com/category/deferred-object/ 

没有重启方法。 您可以手动更改Deferred的属性以模拟“重新启动”它,但实际上我认为您应该在此时创建自己的类,因为您正在寻找Deferred不提供的内容。

你必须记住,Deferred的设计是为了你可以说“嘿延期,去做某事”( new Deferred().when(something) ),然后你可以说“嘿延期,当完成时做X” ( deferred.then(x) )。 现在,当你说“何时完成”,即。 当你进行.then调用时,延迟可以处于两种状态:完成或不完成,但调用在任何一种情况下都有效(如果完成则立即解析,否则等待触发)。

现在,如果Deferred可能有第三个状态(“已完成但已重新启动”),则.then调用将不知道该怎么做:“已完成但重新启动”是否意味着它应该触发它是不是? 答案取决于您是否在重新启动调用之前或之后进行了.then调用,并且您希望看到所有调用都有可能变得相当复杂(特别是如果您允许多次重启)。

而不是处理所有这些( $.ajax都不需要)jQuery人员采用(相对简单的)当前的延期实现,我认为这是他们正确的调用。

你可以试试这个方法:

 function Defer() { $.when(messageLoader, friendRequestLoader) .done(function (messages, friendRequests) { console.log("M : " + messages[0].test); console.log("F : " + friendRequests[0].test); }); } $("#updateMessages").click(function(){ messageLoader = $.post("api/user/messages", {api:data}); Defer(); }); 

这将允许您重新加载一个,同时保持数据与另一个。

它就像创建一个函数并回忆它一样简单。 由于http是一个静态协议,因此无法使$ .post保持活动状态。

 var messageLoader; var friendRequestLoader; updateMessages(); function updateMessages(){ messageLoader= $.post("api/user/messages", {api:data}) friendRequestLoader = $.post("api/user/friendrequests", {api:data}) } $.when(messagesLoader, friendRequestLoader) .done(function (messages, friendRequests) { // update display of messages and friend requests // attach Handlers }); $("#updateMessages").click(function(){ updateMessages(); // This doesn't exist })