数据库设计模型
<project>
-- data
---- employee
------ employee1
-------- colleagues
---------- 0: employee2_id
---------- 1: employee3_id
---------- 2: employee4_id
---------- 3: employee5_id
目标: 我想按值(例如employee3_id)搜索同事数组,然后删除该条目。如果我可以重新排序列表(0,1,2...)那就更好了。
当我想从employee1的同事列表中删除employee3_id时所需的输出。
<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);
});
到目前为止的问题: itemList = snapshot.val(); 行执行后,itemList 仍为空,并且整个项目被清空。
最佳答案
首先,如果您只想获取一次数据,请使用 once()
而不是 on()
。 on()
设置一个持久监听器,当引用位置下的任何位置发生数据更改时,该监听器会重复触发,并且它会继续触发,直到您删除监听器。我很确定这不是您想要的。
其次,once()
和 on()
都是异步的,这意味着它们会立即返回,并且您传递给它的回调函数会在一段时间后执行。你不知道需要多长时间。这意味着您的代码将在 once()
或 on()
之后继续执行,而不知道查询结果。这就是为什么您的 itemList
为空 - 这是您最初分配给它的值,并且尚未更改。
如果您想对查询结果执行某些操作,则应该在回调函数本身中执行此操作,或者使用 once()
返回的 Promise。
关于javascript - 根据 Firebase 中的值从数组中删除键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54058219/