javascript - 根据 Firebase 中的值从数组中删除键

标签 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 仍为空,并且整个项目被清空。

最佳答案

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

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

如果您想对查询结果执行某些操作,则应该在回调函数本身中执行此操作,或者使用 once() 返回的 Promise。

关于javascript - 根据 Firebase 中的值从数组中删除键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54058219/

相关文章:

javascript - 将 Firebase 对象转换为数组

javascript - 比较数组中的两个元素,如果某些属性匹配,则更新第一个数组的属性

javascript - Firebase功能独立线程?

firebase - 从 Firefox 和 Safari 扩展中使用 Firebase

angular - Angularfire/Firebase 实现了哪些 OAuth Flow?

angularjs - 当对象包含 ng-repetate 时,如何使用 angularFire 保存 Firebase 对象 $asArray()

Angularfire2读取数据一次

javascript - 几个链接在粘性导航菜单中不起作用

javascript - 绝对定位包含 div 以适合内部内容或视口(viewport)

javascript - 在 JavaScript 中查找数组中正元素的索引