PubNub API 中的发布回调返回如下消息 -
[1,"Sent","13729639808030640"]
但这并没有给出关于这个回调是针对哪条消息的任何指示。在发布错误的情况下,返回数组中的第一个值为 0。但是如何找出要重新发布的消息呢?
发布者可以以高速率发布消息,并且在发布另一条消息之前不等待接收回调。因此,当调用回调时,发布者可能已经发布了另外 10 条消息。
PubNub REST API 也提供 JSONP 格式。您可以创建“回调函数”标识符到实际消息的映射,当处理完成时,您可以使用响应中的“回调函数”标识符获取原始消息的引用。
例如:
https://pubsub.pubnub.com/publish/demo/demo/0/iosdev/m_2c453/%22Hello%20world2%22
如您所见,m_2c453
URI中有,服务器将使用它来响应:
m_2c453([1,"Sent","14034711347326358"])
在这里我们知道,它m_2c453
已被用于发送"Hello world"
消息。
但是,我认为平台相关的 PubNub SDK 应该为您处理所有这些。
由于消息回复太长,因此转移到这里。
作为对@Geremy 的回复,所以如果将发送消息 1、2、3、4、5,我会按 1、2、3、4、5 的顺序收到发布回调吗?不会出现响应在 2 和 4 中失败的情况吗?在这种情况下,如果我们继续我们得到有序响应的概念,这将意味着消息 4 和 5 而不是消息 2 和 4 的响应未能到达。我是否可以建议 pubnub 团队添加一个他们返回的 JSONArray 中的第四个数据,它将包含已发布消息中的 id 字段(如果有这样的数据,例如 { "id":123, message:"hello"} ),如果没有,显然返回的 id 将为 null 或空字符串。
我面临着类似的挑战。我想在设备离线时对消息进行排队,然后在重新连接时发送它们。在回调中,我需要一种知道发送了哪条消息以将其从队列中删除的方法。我想出了这个解决方案:
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