JavaScript:在创建具有共享值的侦听器的循环期间封装上下文

JavaScript: Encapsulate context during loops that create listeners with shared values

Language/Tools 问题:

Firebase 和原版 JavaScript


我的问题:

循环时- 我试图封装创建 2 个侦听器的上下文和它们都操作的布尔值,

保留上下文的问题:


我的代码:

在每个循环中创建 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/*

}

此代码中的错误:


问题:

如何正确地在 2 个事件侦听器之间共享 "messagesLoaded"?


如有必要,说明应如何使用布尔值:

1) messagesLoaded 在循环中设置为 false(初始化阶段)

2) on.("value"... 加载并且 messagesLoaded 设置为 "true"(initialization-stage)

3) messagesLoadedchild_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)
  });
}