如何使用pubnub timetoken处理页面刷新

How to use pubnub timetoken to handle page refreshes

连接 pubnub 后,我的应用程序内的用户可以毫无问题地接收消息。但是,假设他们刷新页面或转到应用程序中的另一个页面。在用户可以再次连接到 pubnub 之前,有 2 -> 5 秒的停机时间。在此期间,可能会错过一些 pubnub 消息。

幸运的是,pubnub subscribe API 允许您指定 timetoken 以指向过去的时间(例如 10 秒前)。

pubnub.subscribe({
  channels: ['my_channel'],
  timetoken: '13534398158620385'
});

描述:

指定开始返回任何可用缓存消息的时间标记。

问题: 指定此 timetoken 的最安全方法是什么,这样就不会遗漏几条消息?

首先,监听 window 上的 beforeunload 事件。这些将在页面移开之前被触发。在此创建一个 cookie 以保存当前 timetoken:

window.addEventListener('beforeunload', () => {
  const now = new Date().getTime();
  // pubnub timetokens are 17 digits long
  const timetoken = `${now}0000`;

  createCookie(PUBNUB_TIMETOKEN_COOKIE, timetoken, EXPIRATION);
});

注意:PUBNUB_TIMETOKEN_COOKIEEXPIRATION 是您选择的常量。我将我的 cookie 设置为在 10 秒后过期以防止冲突。此外,您还需要定义一个类似于 this one.

createCookie 函数

接下来,在页面加载时订阅 pubnub 时,如果存在此 cookie,则使用它:

pubnub.subscribe({
  channels: ['my_channel'],
  timetoken: getCookie(PUBNUB_TIMETOKEN_COOKIE)
});

这样,如果用户刷新或导航到另一个页面,应该会捕获错过的消息。