数据库设计模型
<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保持为空,整个项目被清空。
答案 0 :(得分:2)
首先,如果只想获取一次数据,请使用once()
而不是on()
。 on()
设置了一个持久侦听器,当在参考位置下的任何地方发生数据更改时,该侦听器都会重复触发,并且它将持续触发直到您删除侦听器为止。我很确定那不是您想要的。
第二,once()
和on()
都是异步的,这意味着它们会立即返回,并且传递给它的回调函数会在一段时间后执行。您不知道需要多长时间。这意味着您的代码将在once()
或on()
之后继续执行,而不会知道查询结果。这就是为什么您的itemList
为空-这是您最初为其分配的值,并且尚未更改。
如果要对查询结果进行处理,则应在回调函数本身中进行处理,或使用once()
返回的承诺。