8

PubNub API 中的发布回调返回如下消息 -

[1,"Sent","13729639808030640"]

但这并没有给出关于这个回调是针对哪条消息的任何指示。在发布错误的情况下,返回数组中的第一个值为 0。但是如何找出要重新发布的消息呢?

发布者可以以高速率发布消息,并且在发布另一条消息之前不等待接收回调。因此,当调用回调时,发布者可能已经发布了另外 10 条消息。

4

3 回答 3

3

PubNub REST API 也提供 JSONP 格式。您可以创建“回调函数”标识符到实际消息的映射,当处理完成时,您可以使用响应中的“回调函数”标识符获取原始消息的引用。
例如:

https://pubsub.pubnub.com/publish/demo/demo/0/iosdev/m_2c453/%22Hello%20world2%22  

如您所见,m_2c453URI中有,服务器将使用它来响应:

m_2c453([1,"Sent","14034711347326358"])

在这里我们知道,它m_2c453已被用于发送"Hello world"消息。
但是,我认为平台相关的 PubNub SDK 应该为您处理所有这些。

于 2014-06-22T21:07:09.530 回答
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"} ),如果没有,显然返回的 id 将为 null 或空字符串。

于 2014-06-23T03:12:38.947 回答
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

于 2017-01-13T09:31:31.150 回答