用于客户端存储的信号量?

时间:2014-02-12 05:38:05

标签: javascript node.js socket.io storage

我正在开发一个带有node.js和socket.io的即时消息应用程序,并保存客户端在客户端存储中收到的消息,以便在刷新页面后加载到聊天框中。问题是当他们打开多个浏览器标签并在所有这些连接上接收相同聊天框的消息时。如果已经使用最新值更新了本地存储,是否有一种干净的方法来锁定它?客户端代码是用javascript编写的。

谢谢。

1 个答案:

答案 0 :(得分:0)

我可以想到几种方法来确保只有一个消息实例存储在本地,但最简单的方法可能是使用某种形式的散列或校验和来保证消息的唯一性。

因此,假设您创建一个包含单个消息的对象,如:

var msg={ timestamp:new Date, user:'joe', message:'text' };

而不是将消息存储在按时间排序的数组中,如:

localstore.push(msg);

将它们存储在对象中:

localstore[createHash(msg)]=msg;

createHash()从msg的内容构造唯一键,例如:

function createHash(obj){
  var result='';
  Object.keys(obj).forEach(function(k){
    if(obj.hasOwnProperty(k)){
      result+=obj[k].toString();
    }
  });
  return result;
}

当您想在聊天框中显示消息时,请按照以下时间戳对其进行排序:

var msgs=[];

Object.keys(localstore).forEach(function(k){
  if(localstore.hasOwnProperty(k)){
     msgs.push(localstore[k]);
  }
});

msgs=msgs.sort(function(a,b){
  return a.timestamp.getTime() - b.timestamp.getTime();
});

虽然许多人(包括我)都会指出这既不高效也不优雅,但它可能是最简单的解决方案,如果不使用外部散列库来保证唯一性,例如MD5。