我正在寻找的最简单的例子是这样的:
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/