Nano Hash - криптовалюты, майнинг, программирование

Проблема с чатом Rails ActionCable/Turbolinks: публикация повторяющихся сообщений

У меня проблема с ActionCable и Turbolinks. Я установил приложение для чата, похожее на пример приложения для чата, которым поделился DHH.

Чтобы иметь несколько комнат чата и передать идентификатор комнаты чата инициализатору подписки ActionCable, у меня есть что-то вроде этого:

$(document).on("turbolinks:load",function(){
  var pod_slug = $("#pod_slug_value").val();
  App.pods = App.cable.subscriptions.create(
    { channel: 'PodsChannel', pod_slug: pod_slug },
    {
    received: function(data) {
      if ( $(".chat-stream").length ){
        $(data.message).appendTo($(".chat-stream"));
        $(".chat-stream").scrollTop($(".chat-stream")[0].scrollHeight);
      }
    },

    speak: function(message, pod_slug) {
      return this.perform('speak',{
        message: message,
        pod_slug: pod_slug
      });
    }
  });

  // captures text input from input field
  captureMessage();

});

Однако, когда я нажимаю на приложение и возвращаюсь на страницу, Turbolinks, кажется, несколько раз связывает обработчик подписки, и теперь, когда я отправляю сообщение, я получаю дубликаты сообщений в потоке чата.

Я пытался нарезать эти проблемы во всех отношениях. У меня нет проблемы, когда я не предваряю обработчик подписки:

$(document).on("turbolinks:load",function(){...

Но тогда я не могу получить идентификатор комнаты чата (pod_slug), потому что документ DOM не загружается до выполнения javascript.

Похоже, у этой проблемы есть простое решение, поскольку Basecamp активно поддерживает и ActionCable, и Turbolinks. Многие из демонстрационных руководств по чату предлагаю настроить чат именно таким образом. Я что-то упустил здесь?


Ответы:


1

У меня была такая же проблема, и я исправил ее таким образом

if (!App.pods) {
  App.pods = App.cable.subscriptions.create(
   { channel: 'PodsChannel', pod_slug: pod_slug },
   { ... /* and so on */ }
}

Каждый раз, когда вы перезагружаете страницу, срабатывает событие «turbolinks:load», поэтому вам нужно проверить, был ли уже создан объект App.pods.

Надеюсь, что это поможет вам.

18.10.2016
  • Но разве app.pods не содержит ссылок на все разные чаты? Таким образом, проверка, существует ли он, не позволит вам запускать новые комнаты после создания одной комнаты. Нет? 19.10.2016
  • @ Лоренц Да, ты прав. В моем случае мне нужен только один канал, поэтому это решение сработало для меня. Но сейчас меня интересует этот вопрос, поэтому я постараюсь выяснить, чем я могу вам помочь. 19.10.2016
  • Я сделал нечто подобное, чтобы временно решить свою проблему: 'if (!App.pods || JSON.parse(App.pods.identifier).pod_slug != pod_slug){', но это выглядит очень хакерским. 20.10.2016

  • 2

    Вы можете использовать App.cable.subscriptions.remove для удаления подписки, возвращенной App.cable.subscriptions.create. Так что, возможно, проверьте, установлен ли App.pods, и если да, удалите его, прежде чем снова подписаться.

    18.09.2016

    3

    Мне нравится ваш подход, MaruniakS. Копаясь в объекте-потребителе, похоже, что у него есть тест, чтобы увидеть, отключен ли он. Изменив только первую строку, мы также могли бы сделать:

    if (!App.pods || App.pods.consumer.connection.disconnected) {
      App.pods = App.cable.subscriptions.create(
        { channel: 'PodsChannel', pod_slug: pod_slug },
        { ... /* and so on */ }
    }
    
    02.09.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..