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

时间:2012-12-05 21:24:04

标签: javascript jquery ajax 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数据。

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

3 个答案:

答案 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();          
});

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