【问题标题】:Reuse jQuery.post() / jQuery.Deferred() object重用 jQuery.post() / jQuery.Deferred() 对象
【发布时间】:2023-03-08 18:53:02
【问题描述】:

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

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

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

【问题讨论】:

  • 只需创建一个执行您想要的操作的函数,然后再次调用它?

标签: javascript jquery ajax deferred


【解决方案1】:

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

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

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

没有重启方法。您可能能够手动更改 Deferred 的属性以模拟“重新启动”它,但实际上我认为您现在应该创建自己的类,因为您确实在寻找 Deferred 没有的东西不提供。

您必须记住,Deferred 的设计目的是让您可以说“嘿,Deferred,去做点什么”(new Deferred().when(something)),然后您可以说“嘿,Deferred,完成后做 X”(@987654323 @)。现在,当您说“完成时”时,即。当您进行.then 调用时,Deferred 可以处于两种状态:完成或未完成,但在任何一种情况下调用都有效(如果完成,则立即解析,否则等待触发)。

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

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

【讨论】:

    【解决方案2】:

    你可以试试这个方法:

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

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

    【讨论】:

      【解决方案3】:

      就像创建一个函数并调用它一样简单。由于 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
      })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        • 2011-04-23
        • 1970-01-01
        • 2018-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多