У меня есть контроллер с фоновой работы, чтобы начать ActionCable ПОДПИСКА:Как подписаться на канал после загрузки страницы - ActionCable, DelayedJob
def result
LinkBroadcastJob.perform_later(links)
end
Он выполняет это действие на поток ссылки:
def perform(links)
links.each do |link|
ActionCable.server.broadcast "link_channel", html: render_link(link)
end
end
У меня есть представление с div id = "here" в макете.
В моем файле javascript/channelses/link.coffee.js он должен добавить все ссылки на div.
App.link = App.cable.subscriptions.create { channel: "LinkChannel" },
received: (data) ->
$("#here").append(data.html)
Проблема с этим кодом является то, что подписка начинается до того, как полностью загружена страница - поэтому первые ссылки не отображаются и не хватает.
Я мог бы решить проблему с задержкой с некоторым установленным временем (5 секунд), но это не было бы лучшим опытом, и я не знаю, как быстро это может потребоваться пользователю для загрузки полной страницы. Я попытался сделать также с $ (document) .load, прежде чем он создаст подписку, но она не сработала.
Каков наилучший способ выполнить подписку после загрузки тега div?
ли это поможет обеспечить подписку прислушивается к тому времени вещания принимается? У меня возникла аналогичная проблема, когда я запускаю фоновое задание при переходе на новый маршрут, а фоновое задание передается до загрузки страницы/js и готовности к приему сообщения. – rosegrink
Нет, я не думаю, что так будет. Лучший способ ** обеспечить ** это, отправить запрос со стороны клиента. Кроме того, если ваше фоновое задание завершено до рендеринга на стороне клиента, вероятно, лучше сделать синхронный вызов и отправить данные с ответом сервера – vedant1811
Это имеет смысл. В моем случае я думаю, что было бы разумно сделать запрос на стороне клиента, поскольку работа _could_ займет до 5 минут. Но я согласен с тем, что если это будет так быстро, выполнение работы синхронно будет лучше. – rosegrink