Javascript 按Firebase中的值从数组中移除键

Javascript 按Firebase中的值从数组中移除键,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,数据库设计模型 <project> -- data ---- employee ------ employee1 -------- colleagues ---------- 0: employee2_id ---------- 1: employee3_id ---------- 2: employee4_id ---------- 3: employee5_id 迄今为止的问题: itemList=snapshot.val()之后,itemList仍然为空行执行,整个项目清空。

数据库设计模型

<project>
-- data
---- employee
------ employee1
-------- colleagues
---------- 0: employee2_id
---------- 1: employee3_id
---------- 2: employee4_id
---------- 3: employee5_id
迄今为止的问题:
itemList=snapshot.val()之后,itemList仍然为空行执行,整个项目清空。

首先,如果只想获取一次数据,请使用而不是()上的
on()
设置一个持久侦听器,当引用位置下的任何位置发生数据更改时,该侦听器会重复触发,并继续触发,直到您删除该侦听器为止。我很确定这不是你想要的

其次,
once()
on()
都是异步的,这意味着它们会立即返回,并且传递给它的回调函数会在一段时间后执行。你不知道要花多长时间。这意味着您的代码将在
one()
on()
之后继续执行,而不知道查询的结果。这就是为什么您的
itemList
为空-这是您最初分配给它的值,但它尚未更改


如果要对查询结果执行某些操作,应该在回调函数本身中执行,或者首先使用
once()

返回的承诺,如果只想获取一次数据,请使用而不是
on()
on()
设置一个持久侦听器,当引用位置下的任何位置发生数据更改时,该侦听器会重复触发,并继续触发,直到您删除该侦听器为止。我很确定这不是你想要的

其次,
once()
on()
都是异步的,这意味着它们会立即返回,并且传递给它的回调函数会在一段时间后执行。你不知道要花多长时间。这意味着您的代码将在
one()
on()
之后继续执行,而不知道查询的结果。这就是为什么您的
itemList
为空-这是您最初分配给它的值,但它尚未更改


如果您想对查询结果执行某些操作,应该在回调函数本身中执行,或者利用
once()

返回的承诺。非常感谢您区分once()和on()。正如你可能已经猜到的,我对JS很陌生,更不用说FB了。请您详细说明一下“在回调fx中执行,或者使用once()返回的承诺?”我听说过承诺,但还没有深入了解它是什么以及如何实现它。再次感谢这不是解释承诺的好地方。你应该搜索该主题以了解它。它是JavaScript编程的基础。我指的回调函数是您传递给on()或once()的函数。好的,我做了一些研究,并对代码进行了一些更新。我想我已经答应要工作了。你能告诉我我遗漏了什么吗?非常感谢你区分了once()和on()。正如你可能已经猜到的,我对JS很陌生,更不用说FB了。请您详细说明一下“在回调fx中执行,或者使用once()返回的承诺?”我听说过承诺,但还没有深入了解它是什么以及如何实现它。再次感谢这不是解释承诺的好地方。你应该搜索该主题以了解它。它是JavaScript编程的基础。我指的回调函数是您传递给on()或once()的函数。好的,我做了一些研究,并对代码进行了一些更新。我想我已经答应要工作了。你能告诉我我错过了什么吗?
<project>
-- data
---- employee
------ employee1
-------- colleagues
---------- 0: employee2_id
---------- 1: employee4_id
---------- 2: employee5_id
const databaseRef = firebase.database();
const childRef = databaseRef.ref('data/employee/employee1/colleagues');

let item = 'employee3_id';
let itemList = [];

let itemPromise = new Promise(function (resolve) {
    childRef.once('value').then(function (snapshot) {
        itemList = snapshot.val();
        resolve(itemList);
    })
});

itemPromise.then(function (itemList) {
    itemList.splice(itemList.indexOf(item), 1);
    childRef.set(itemList);
});