JavaScript:在创建具有共享值的侦听器的循环期间封装上下文
JavaScript: Encapsulate context during loops that create listeners with shared values
Language/Tools 问题:
Firebase 和原版 JavaScript
我的问题:
循环时- 我试图封装创建 2 个侦听器的上下文和它们都操作的布尔值,
保留上下文的问题:
无绑定 - for 循环索引计数器未封装但结束时与列表大小相同。
与绑定 - 布尔值的共享上下文丢失。
我的代码:
在每个循环中创建 2 个监听器和 1 个它们共享的布尔值
1) value
- 是否获取原始消息
2) child-added
- Original Fetch(必须跳过)和稍后获取
当布尔值设置为 true
时更新
3) messagesLoaded
- 一个布尔值,表示现在可以侦听子添加事件。
//LOOPING THROUGH THREAD IDS EG. [-K1234ASDFADFA,-K43123414234F ]
for(var i = 0; i < threadIDs.length; i++) { //INSIDE LOOP,USING CORE STRATEGY.
var messagesLoaded = false;
//FIRST: Load all the Messages of a thread
var threadRef = firebaseThreadRef.child(threadIDs[i]);
threadRef.on("value",function(snapshot) {
var thread = snapshot.val();
messagesLoaded = true;
});
//SECOND: GET NEW MESSAGES AS THE ARE ADDED
var messagesRef = threadInstanceRef.child("messages");
var currentThreadId = threadIDs[i];
//GRABBING TO BIND PARENT ID TO LISTENER
messagesRef.on('child_added', function(snap) {
if(messagesLoaded ) {
//MESSAGESLOADED HAS LOST SCOPE!!!!
var newThreadMessage = snap.val();
newThreadMessage ["id"] = snap.key();
receiveThreadMessage(newThreadMessage,this.instanceThreadID);
}
}.bind({instanceThreadID:currentThreadId}));
/*WITHOUT BIND THE CORRECT INDEX 'i' WILL ALWAYS BE THE SIZE TO THE LIST
AND NOT WHAT IT WAS DURING THE ITERATION/*
}
此代码中的错误:
child_added
上的绑定需要在稍后触发时保持 threadsIDs[i]
的上下文。
但是通过绑定,messagesLoaded
不再在 2 个侦听器之间共享。
问题:
如何正确地在 2 个事件侦听器之间共享 "messagesLoaded"?
如有必要,说明应如何使用布尔值:
1) messagesLoaded
在循环中设置为 false(初始化阶段)
2) on.("value"...
加载并且 messagesLoaded
设置为 "true"(initialization-stage)
3) messagesLoaded
在 child_added
侦听器中共享更新的上下文
启用它(更新阶段)
这有点像在黑暗中开枪,因为你有很多事情要做,但你遇到了一系列问题 - 特别是异步代码和 for 循环中的闭包。这可能会让你更亲近。
for(var i = 0; i < threadIDs.length; i++) {
firebaseThreadRef.child(threadIDs[i]).on("value", function(snapshot) {
var thread = snapshot.val();
(function(i){
var currentThreadId = threadIDs[i];
threadInstanceRef.child("messages").on('child_added', function(snap) {
var newThreadMessage = snap.val();
newThreadMessage ["id"] = snap.key();
receiveThreadMessage(newThreadMessage, currentThreadId);
});
})(i)
});
}
Language/Tools 问题:
Firebase 和原版 JavaScript
我的问题:
循环时- 我试图封装创建 2 个侦听器的上下文和它们都操作的布尔值,
保留上下文的问题:
无绑定 - for 循环索引计数器未封装但结束时与列表大小相同。
与绑定 - 布尔值的共享上下文丢失。
我的代码:
在每个循环中创建 2 个监听器和 1 个它们共享的布尔值
1) value
- 是否获取原始消息
2) child-added
- Original Fetch(必须跳过)和稍后获取
当布尔值设置为 true
3) messagesLoaded
- 一个布尔值,表示现在可以侦听子添加事件。
//LOOPING THROUGH THREAD IDS EG. [-K1234ASDFADFA,-K43123414234F ]
for(var i = 0; i < threadIDs.length; i++) { //INSIDE LOOP,USING CORE STRATEGY.
var messagesLoaded = false;
//FIRST: Load all the Messages of a thread
var threadRef = firebaseThreadRef.child(threadIDs[i]);
threadRef.on("value",function(snapshot) {
var thread = snapshot.val();
messagesLoaded = true;
});
//SECOND: GET NEW MESSAGES AS THE ARE ADDED
var messagesRef = threadInstanceRef.child("messages");
var currentThreadId = threadIDs[i];
//GRABBING TO BIND PARENT ID TO LISTENER
messagesRef.on('child_added', function(snap) {
if(messagesLoaded ) {
//MESSAGESLOADED HAS LOST SCOPE!!!!
var newThreadMessage = snap.val();
newThreadMessage ["id"] = snap.key();
receiveThreadMessage(newThreadMessage,this.instanceThreadID);
}
}.bind({instanceThreadID:currentThreadId}));
/*WITHOUT BIND THE CORRECT INDEX 'i' WILL ALWAYS BE THE SIZE TO THE LIST
AND NOT WHAT IT WAS DURING THE ITERATION/*
}
此代码中的错误:
child_added
上的绑定需要在稍后触发时保持threadsIDs[i]
的上下文。但是通过绑定,
messagesLoaded
不再在 2 个侦听器之间共享。
问题:
如何正确地在 2 个事件侦听器之间共享 "messagesLoaded"?
如有必要,说明应如何使用布尔值:
1) messagesLoaded
在循环中设置为 false(初始化阶段)
2) on.("value"...
加载并且 messagesLoaded
设置为 "true"(initialization-stage)
3) messagesLoaded
在 child_added
侦听器中共享更新的上下文
启用它(更新阶段)
这有点像在黑暗中开枪,因为你有很多事情要做,但你遇到了一系列问题 - 特别是异步代码和 for 循环中的闭包。这可能会让你更亲近。
for(var i = 0; i < threadIDs.length; i++) {
firebaseThreadRef.child(threadIDs[i]).on("value", function(snapshot) {
var thread = snapshot.val();
(function(i){
var currentThreadId = threadIDs[i];
threadInstanceRef.child("messages").on('child_added', function(snap) {
var newThreadMessage = snap.val();
newThreadMessage ["id"] = snap.key();
receiveThreadMessage(newThreadMessage, currentThreadId);
});
})(i)
});
}