gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 19:19:00 24 4
gpt4 key购买 nike

问题的语言/工具:

Firebase 和普通 JavaScript


我的问题:

循环时- 我试图封装创建 2 个监听器的上下文和它们都操纵的 bool 值,

保留上下文的问题:

  • 无绑定(bind) - for 循环索引计数器未封装但结束时与列表大小相同。

  • 绑定(bind) - bool 值的共享上下文丢失。


我的代码:

在每个循环中创建 2 个监听器和 1 个它们共享的 bool 值

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

2) child-added - Original Fetch(必须跳过)和以后获取 当 bool 值设置为真时更新

3) messagesLoaded - 一个 bool 值,表示现在可以监听子添加事件。

//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 上的绑定(bind)需要在以后触发时保持 threadsIDs[i] 的上下文。

  • 但是通过绑定(bind),messagesLoaded 不再在 2 个监听器之间共享。


问题:

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


如果需要,说明应如何使用 bool 值:

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

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

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

关于JavaScript:在创建具有共享值的监听器的循环期间封装上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33930022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com