PubNub API中的发布回调返回如下消息 -
[1,"Sent","13729639808030640"]
但是这并没有说明这个回调是针对哪个消息的。如果发布错误,返回数组中的第一个值将为0.但是如何找出要重新发布的消息?
发布者可以高速发布消息,而不是在发布其他消息之前等待接收回调。因此,当调用回调时,发布者可能已经发布了10条消息。
答案 0 :(得分:3)
PubNub REST API也提供JSONP格式。您可以为实际消息创建“回调函数”标识符的映射,并且在处理完成后,您可以使用响应中的“回调函数”标识符获取原始消息的引用。
例如:
https://pubsub.pubnub.com/publish/demo/demo/0/iosdev/m_2c453/%22Hello%20world2%22
如您所见,URI中有m_2c453
,服务器将使用它作为响应:
m_2c453([1,"Sent","14034711347326358"])
我们知道,m_2c453
已用于发送"Hello world"
消息
但是,我认为依赖于平台的PubNub SDK应该为您处理所有这些。
答案 1 :(得分:0)
此处转移,因为邮件回复时间过长。
在回复@Geremy时,如果发送消息1,2,3,4,5,我将以1,2,3,4,5的顺序获得发布回调?在第2和第4阶段,响应会失败的情况会不会成为现实?在这种情况下,如果我们继续认为我们得到了一个有序的响应,这意味着响应无法到达消息4和5而不是2和4.我可能会向pubnub团队建议他们在他们返回的JSONArray中添加第四个数据,它将包含已发布的消息中的id字段(如果有这样的数据,例如{" id":123,message:" hello&# 34;}),如果没有,显然返回的id将为null或空字符串。
答案 2 :(得分:0)
我遇到了类似的挑战。我想在设备离线时排队消息,然后在重新连接时发送消息。在回调中,我需要一种方法来了解发送了哪些消息以将其从队列中删除。我提出了这个解决方案:
function sendData(channel, data, callback) {
Pubnub.publish({
channel: channel,
message: data,
callback : callback
});
}
//This code is placed within the "reconnect" callback of the subscription
if ($localStorage.chatQueue.length) {
for (var i = 0; i < $localStorage.chatQueue.length; i++) {
sendData(
$localStorage.chatQueue[i].channel,
$localStorage.chatQueue[i].data,
function(){
console.log("arguments");
console.log(arguments);
console.log("this");
console.log(this);
index = $localStorage.chatQueue.indexOf(this);
console.log("Message in offline queue sent, index = "+index);
if (index > -1) {
$localStorage.chatQueue.splice(index, 1);
}
}.bind($localStorage.chatQueue[i])
);
}
}
技巧是将回调函数中的this
绑定到消息对象。它似乎工作。我想也可以绑定i
变量,该变量将直接指向队列中的消息。
我在另一个问题中受到了这个答案的启发:https://stackoverflow.com/a/19472945/3319392