PubNub订阅消息回调未触发

时间:2014-11-06 23:11:55

标签: angularjs coffeescript pubnub

我在解决PubNub的订阅消息处理程序时遇到问题。我正在开发一个能够收听移动应用消息的网络客户端。直到最近,这段代码运行良好。我可以从手机发送消息,看到网络应用程序自动更新。但在过去的几天里,网络应用程序不再更新。

这是一个我用CoffeeScript编写的Angular应用程序。我有一个MessageService来处理PubNub的所有引导。我的服务的subscribe方法传递一个实体id arg来设置为要监听的通道名称,并通过messageHandler参数传递函数引用。

angular.module('exampleApp').service 'MessageService', ($http, $interval) ->
  pubnub = null
  subscribePromise = null

  config =
    subscribe_key: 'demo'

  # Sanity check. This gets triggered upon connection with the correct 
  # channel name/entity id.
  connectionHandler = ->
    _.forOwn arguments, (arg) -> console.log arg

  return {
    getChats: (id) ->
      # Calls an API to fetch all of the chat messages. These aren't transmitted over
      # PubNub because we do other fun things to adhere to HIPAA compliance.
      return $http.get 'path/to/api/endpoint/' + id
    subscribe: (id, messageHandler) ->
      pubnub = pubnub or PUBNUB.init config
      pubnub.subscribe({
        channel: id
        message: (data) ->
          if not not subscribePromise
            $interval.cancel subscribePromise
            subscribePromise = null
          messageHandler data
        connect: connectionHandler
      })

      # Interval-based workaround to function in spite of PubNub issue
      subscribePromise = $interval messageHandler, 10000
  }

以下是我的一个控制器中messageHandler实现的示例。

angular.module('exampleApp').controller 'MessageCtrl', (MessageService) ->
  $scope.messageId = 'some entity id'

  # This message handler never gets fired, despite passing it to pubnub.subscribe
  onMessageUpdated = (data) ->
    console.log data
    MessageService.getChats($scope.messageId).then (messages) -> $scope.messages = messages

  MessageService.subscribe $scope.messageId, onMessageUpdated

就像我提到的那样,这段代码不久前就开始工作了,但是出乎意料的是,消息处理程序完全停止了。一个多月没碰过它了。令我疯狂的是,我可以在PubNub中打开开发控制台并观看来自手机的消息,但由于某种原因,该消息处理程序似乎永远不会被调用。

我正在使用pubnub.js的“边缘”版本,所以我想知道是否有一些最近的更新破坏了我的实现。你有其他人可以看到我可能遗失或做错了吗?任何帮助表示赞赏。

//编辑

快速更新。我已经尝试回滚到3.5.47并且仍然没有改变行为。我使用Angular的$interval服务编写了一个快速的解决方法,以便在我弄清楚这个问题时让应用程序至少运行。更新了上面的相关更改的代码示例。

1 个答案:

答案 0 :(得分:0)

快速更新。在继续执行其他一些任务并在一年左右后回到这个任务之后,我们决定再次尝试这个问题。如上所述,基于区间的轮询对我们的初始实现工作正常,但我们现在需要一组更强大的功能。

无论如何,我们最终抓住了JS客户端的最新稳定版本(3.7.21),到目前为止它似乎解决了我们的问题。