7

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

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数据。

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

4

3 回答 3

4

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

此外,您可以从 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 实现,我认为这是他们的正确选择。

于 2012-12-05T21:51:42.113 回答
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
})
于 2012-12-05T22:13:19.707 回答
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();          
});

这将允许您重新加载一个,同时保留另一个数据。

于 2012-12-05T22:17:18.757 回答