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

syn*_*omy 7 javascript ajax jquery deferred

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

var messageLoader = $.post("api/user/messages", {api:data})

messageLoader.done(function(data){
   //do something 
});
Run Code Online (Sandbox Code Playgroud)

这种方法非常出色,但只有一次.如果我想更新数据,我必须重新定义所有内容.

我似乎无法找到任何延迟对象的调用,让我重新启动它.即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
})
Run Code Online (Sandbox Code Playgroud)

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

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

mac*_*ost 4

我很确定 Deferred 类并不是按照您想要的方式设计的,因为它们旨在成为一次性使用对象。我什至参加了 jQueryConf 上关于 Deferreds 的整个会议,甚至没有提到重用它们。

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

http://api.jquery.com/category/deferred-object/
Run Code Online (Sandbox Code Playgroud)

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

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

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

jQuery 人员没有处理所有这些(这些都不需要$.ajax),而是使用(相对简单的)当前的 Deferred 实现,我认为这对他们来说是正确的选择。