2014-02-12 60 views
0

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

谢谢。

回答

0

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

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

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

而是按时间排序像一个阵列中存储的消息:在一个对象作为

localstore.push(msg); 

商店他们:

localstore[createHash(msg)]=msg; 

其中createHash()从内容构造一个唯一的键味精,如:

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。