如何处理/排队多个ajax帖子?

时间:2014-05-01 07:21:31

标签: jquery ruby-on-rails coffeescript

我在Rails 3.2应用程序中有一个索引视图,它在每条记录旁边显示一个删除按钮。

<%= link_to "Delete", object, method: :delete, remote: true, class: 'delete' %>

我最初创建了一个destroy.js.erb文件,用于在销毁对象时删除它。然而,这并没有给出我想要的快速和反应灵敏的体验。

相反,我设置了这个coffeescript功能

jQuery ->
  if $('a.delete').length
    $("a.delete").click ->
      if confirm("Are you sure?")
        row = $(this).closest("tr").get(0)
        $.post @href,
          _method: "delete"
        , null, "script"
        $(row).hide()
        false
      else
        #they clicked no.
        false

99%的情况下效果很好。但是当用户连续快速删除多个对象时,我发现了一些边缘情况。当对象被隐藏时,有些对象似乎没有被正确删除,并在页面重新加载时再次显示。

有没有更好的方法来完成此任务,或者排队我的.post请求,以便我可以100%确信他们完成所有操作?

1 个答案:

答案 0 :(得分:0)

如果要对任务进行排队,可能需要考虑delayed_job gem https://github.com/collectiveidea/delayed_job

至于将更好的方法保留在页面上以便删除,您可以将delayed_job与&#34; pending_deletion&#34;模型上的布尔字段。当用户指示要删除对象时,将其标记,提交删除作业,然后运行Coffeescript函数将其隐藏。绘制视图之前的初始查询可以修改为包含pending_delete!= true的对象。这对我来说有点像,但如果您的删除过程很慢或者您的队列经常备份,那么这似乎是合理的。

您也可能(或者)想要考虑将CoffeeScript函数作为对控制器操作的响应来执行。如果Object.delete返回true,则运行该函数并隐藏该对象。