8

To create subscriptions I run:

  App.room = App.cable.subscriptions.create({
    channel: "RoomChannel",
    roomId: roomId
  }, {
    connected: function() {},
    disconnected: function() {},
    received: function(data) {
      return $('#messages').append(data['message']);
    },
    speak: function(message, roomId) {
      return this.perform('speak', {
        message: message,
        roomId: roomId
      });
    }
  });

But because I want the client to never be subscribed to more than one channel, what can I run each time before this to remove all subscriptions the client has?

I tried to do something super hacky like:

App.cable.subscriptions['subscriptions'] = [App.cable.subscriptions['subscriptions'][1, 0]]

But I'm sure it didn't work because there are many other components that go into a subscription/unsubscription.

App.cable.subscriptions.remove requires a subscription argument, but what do I pass in?

Thanks!

Laser
  • 5,085
  • 4
  • 34
  • 48

3 Answers3

9

A bit of a late answer, but considering you've already declared

App.room = App.cable.subscriptions.create(...)

to remove, something like

if (App.room) App.cable.subscriptions.remove(App.room);

should suffice.

Matthew Ager
  • 326
  • 3
  • 7
3

Running this before each subscription creation will ensure there is only ever a maximum of one subscription per client.

if (App.cable.subscriptions['subscriptions'].length > 1) {
    App.cable.subscriptions.remove(App.cable.subscriptions['subscriptions'][1])
};
Laser
  • 5,085
  • 4
  • 34
  • 48
2

It looks like you would need to create a reference to your subscription on create

let mySubscription = App.cable.subscriptions.create({
  channel: "MyChannel"
},
{
  connected: () => { console.log('connected') },
  disconnected: () => {},
  received: (data) => {}
});

and then remove it like so

App.cable.subscriptions.remove(mySubscription)
stowns
  • 321
  • 1
  • 10