繁体   English   中英

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

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

语言/问题工具:

Firebase和Vanilla JavaScript


我的问题:

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

保留上下文的问题:

  • 没有绑定 -for循环索引计数器未封装,但结尾与列表大小相同。

  • 通过绑定 -布尔值的共享上下文丢失。


我的代码

在每个循环中,创建2个侦听器和1个布尔值

1) value -是否原始获取消息

2) child-added -布尔值设置为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]的上下文。

  • BUT通过结合, messagesLoaded不再是2个听众之间共享。


问题:

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


如果需要,请澄清如何使用布尔值:

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

2)将on.("value"...加载,并将messagesLoaded设置为“ true”(初始化阶段)

3) messagesLoadedchild_added侦听器中共享更新的上下文,从而启用了它(update-stage)

这是在黑暗中拍摄的镜头,因为那里发生了很多事情,但是您遇到了很多问题,特别是异步代码和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)
  });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM