Как обрабатывать / ставить в очередь несколько сообщений AJAX?

0

У меня есть индексный указатель в приложении 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% уверен, что они все делают?

Теги:
coffeescript

1 ответ

0

Если вы хотите ставить задачи в очередь, вам может потребоваться рассмотреть затянувшийся жемчуг, https://github.com/collectiveidea/delayed_job.

Что касается лучшего способа хранения элементов, предназначенных для удаления со страницы, вы можете комбинировать delayed_job с логическим полем "pending_deletion" на вашей модели. Когда пользователь указывает, что объект должен быть удален, отметьте его, отправьте задание удаления, а затем запустите свою функцию Coffeescript, чтобы скрыть ее. Ваш первоначальный запрос перед рисованием представления может быть изменен, чтобы включить объекты, где pending_delete! = True. Это мне очень нравится, но если процесс удаления медленный или ваша очередь часто подкрепляется, это кажется разумным.

Вы также можете (или альтернативно) захотеть, чтобы ваша функция CoffeeScript выполнялась как ответ на действие контроллера. Если Object.delete возвращает true, функция запускается и объект скрыт.

  • 0
    спасибо subvertallchris. Есть ли в любом случае очередь Ajax-запросов в браузере, хотя? Моя задача удаления на стороне сервера уже оптимизирована, и я использую queue_classic для долгосрочных задач. В этом случае между отправкой запроса на pending_deletion или обновлением поля pending_deletion будет сэкономлено очень мало времени - и то, и другое требует задержки, пока соединение установлено и отправлено. Я ищу очень быстрый ответ на стороне клиента для обновления представления, но мне нужно больше уверенности, что все запросы на уничтожение будут выполнены, чем обеспечивает моя текущая настройка. Спасибо за ваши идеи
  • 0
    Понятно! Мне кажется, что единственный способ убедиться, что ваш запрос на уничтожение выполняется, - это запустить $(row).hide() на основе успешного ответа от $.post . Если я неправильно читаю ваш CoffeeScript или чего-то не хватает, похоже, он пытается создать сообщение, а затем скрывает строку, независимо от результата публикации. Или есть задержка в ответе почты, которая препятствует тому, чтобы это было выбором?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню