通过Firebase中的值从数组中删除键

时间:2019-01-06 02:45:22

标签: javascript firebase firebase-realtime-database

数据库设计模型

<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保持为空,整个项目被清空。

1 个答案:

答案 0 :(得分:2)

首先,如果只想获取一次数据,请使用once()而不是on()on()设置了一个持久侦听器,当在参考位置下的任何地方发生数据更改时,该侦听器都会重复触发,并且它将持续触发直到您删除侦听器为止。我很确定那不是您想要的。

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

如果要对查询结果进行处理,则应在回调函数本身中进行处理,或使用once()返回的承诺。