我在解决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
服务编写了一个快速的解决方法,以便在我弄清楚这个问题时让应用程序至少运行。更新了上面的相关更改的代码示例。
答案 0 :(得分:0)
快速更新。在继续执行其他一些任务并在一年左右后回到这个任务之后,我们决定再次尝试这个问题。如上所述,基于区间的轮询对我们的初始实现工作正常,但我们现在需要一组更强大的功能。
无论如何,我们最终抓住了JS客户端的最新稳定版本(3.7.21),到目前为止它似乎解决了我们的问题。