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

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

messageLoader.done(function(data){
   //do something
});

这很出色,但是只有一次。如果要更新数据,则必须重新定义所有内容。

我似乎找不到对Deferred Object的任何调用,让我重新启动它。即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的整个 session ,甚至都没有提到重用它们。

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

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

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

您必须牢记,Deferred的设计宗旨是可以说“嘿Deferred,去做点什么”(new Deferred().when(something)),然后说“嘿Deferred,完成后再做X”(deferred.then(x))。现在,当您说“完成时”,即。当您进行.then调用时,Deferred可以处于两种状态:完成或不执行,但是该调用在两种情况下均有效(如果完成,则立即解决,否则等待被触发)。

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

jQuery员工没有处理所有这些($.ajax不需要任何处理),而是采用了(相对简单的)当前的Deferred实现,我认为这是正确的选择。

关于javascript - 重用jQuery.post()/jQuery.Deferred()对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13732713/

10-12 18:22