我正在寻找的最简单的例子是:
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
数据。
我已经在文档中查找了类似的内容,但没有找到任何内容。也许这里有人知道它是否存在,或者是一种完成同样事情的方法。
答案 0 :(得分:4)
我很确定Deferred类的设计并不是按照你想要的方式工作,因为它们的目的是成为一次性使用对象。我甚至参加了jQueryConf上关于Deferreds的整个会议,并且甚至没有提到重新使用它们。
此外,正如您可以在Deferred API页面中看到的那样:
http://api.jquery.com/category/deferred-object/
没有重启方法。您可能能够手动更改延迟的属性以模拟“重新启动”它,但实际上我认为您应该在此时创建自己的类,因为您正在寻找Deferred的内容不提供。
你必须记住,延迟的设计是为了你可以说“嘿延期,去做某事”(new Deferred().when(something)
),然后你可以说“嘿延期,当完成时做X”( deferred.then(x)
)。现在,当你说“何时完成”,即。当你进行.then
调用时,延迟可以处于两种状态:完成或不完成,但调用在任何一种情况下都有效(如果完成则立即解析,否则等待触发)。
现在,如果Deferred可能有第三个状态(“已完成但已重新启动”),.then
调用将不知道该怎么做:“已完成但重新启动”意味着它应该触发它的天堂,或不?答案取决于您是否在重新启动调用之前或之后进行了.then
调用,并且您希望看到所有调用都有可能变得相当复杂(特别是如果您允许多次重启)。
而不是处理所有这些($.ajax
都不需要)jQuery人员采用(相对简单的)当前延迟实现,我认为这是他们正确的调用。
答案 1 :(得分:0)
这就像创建一个函数并回忆它一样简单。由于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
})
答案 2 :(得分:0)
您可以尝试以下方法:
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();
});
这将允许您在保持数据与另一个数据的同时重新加载一个。