Private_pub:如何取消订阅频道

时间:2012-07-02 10:53:03

标签: ruby-on-rails faye

我正在使用private_pub制作私人聊天应用程序,我的问题是如何使用private_pub取消订阅频道?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

如果您在您的网站中使用pjax或ajax,并且您使用ajax加载的页面中有private_pub订阅方法,那么您会发现它多次订阅 在搜索了很多关于我发现这些来自privat_pub javascript文件的解决了这些问题之后

var PrivatePub = (function (doc) {
 var self = {
connecting: false,
fayeClient: null,
fayeCallbacks: [],
subscriptions: {},
subscriptionCallbacks: {},

faye: function(callback) {
  if (self.fayeClient) {
    callback(self.fayeClient);
  } else {
    self.fayeCallbacks.push(callback);
    if (self.subscriptions.server && !self.connecting) {
      self.connecting = true;
      if (typeof Faye === 'undefined') {
        var script = doc.createElement("script");
        script.type = "text/javascript";
        script.src = self.subscriptions.server + ".js";
        script.onload = self.connectToFaye;
        doc.documentElement.appendChild(script);
      } else {
        self.connectToFaye();
      }
    }
  }
},

connectToFaye: function() {
  self.fayeClient = new Faye.Client(self.subscriptions.server);
  self.fayeClient.addExtension(self.fayeExtension);
  for (var i=0; i < self.fayeCallbacks.length; i++) {
    self.fayeCallbacks[i](self.fayeClient);
  };
},

fayeExtension: {
  outgoing: function(message, callback) {
    if (message.channel == "/meta/subscribe") {
      // Attach the signature and timestamp to subscription messages
      var subscription = self.subscriptions[message.subscription];
      if (!message.ext) message.ext = {};
      message.ext.private_pub_signature = subscription.signature;
      message.ext.private_pub_timestamp = subscription.timestamp;
    }
    callback(message);
  }
},

sign: function(options) {
  if (!self.subscriptions.server) {
    self.subscriptions.server = options.server;
  }
  if (!self.subscriptions[options.channel]) {
    self.subscriptions[options.channel] = options;
    self.faye(function(faye) {
      faye.subscribe(options.channel, self.handleResponse);
    });
  }
},

handleResponse: function(message) {
  if (message.eval) {
    eval(message.eval);
  }
  if (callback = self.subscriptionCallbacks[message.channel]) {
    callback(message.data, message.channel);
  }
},

subscribe: function(channel, callback) {
  self.subscriptionCallbacks[channel] = callback;
}
 };
  return self;
   }(document));

试一试。