【发布时间】:2017-08-27 09:38:22
【问题描述】:
我正在向我的 chrome 扩展程序添加通知,让用户可以互相聊天。每个用户都有一个chats 部分,其中列出了他们所在的所有聊天室,以及他们看到的最后一条消息。为了检查他们不在时是否发送了消息,我正在尝试遍历他们所在的聊天室,并查看在他们看到的最后一条消息添加后,最后一条发送的消息是否已添加到数据库中。
这是我的代码,我使用的是一个名为 firebase 的 noSQL 数据库:
var checkNotifications = function(user){
var notification = false;
firebase.database().ref('users/'+user+'/chats').once('value', function(snapshot){
for (var chat in snapshot.val()){
var lastMessage = snapshot.val()[chat];
firebase.database().ref('chats/'+chat+'/msgs').once('value', function(snap){
if (Object.keys(snap.val())[0] > lastMessage){
notification = true; // Message is newer than their last seen message
}
});
}
});
}
我遇到的问题是,在第二次数据库调用返回来自当前在 for 循环中查看的聊天室的消息之前,for 循环已经继续前进并更新变量 lastMessage,因此变量结束持有来自聊天室的最后一条消息。
有没有办法减少异步,以便变量 lastMessage 在 for 循环中的每一步都具有相同的值?
【问题讨论】:
-
这里期望的过程是什么?您想连续迭代并在找到匹配项时停止吗?您想并行迭代并知道是否有任何操作满足您的条件吗?
-
我的最终目标是获得一个数组,其中每个索引都有
true或false,具体取决于用户看到的最后一条消息之后是否发送了消息,但现在我只想了解在相应聊天室中看到的最后一条消息之后是否发送了任何消息。
标签: javascript firebase asynchronous firebase-realtime-database nosql