Удалить ключ из массива по его значению в Firebase - PullRequest
0 голосов
/ 06 января 2019

Макет дизайна базы данных

<project>
-- data
---- employee
------ employee1
-------- colleagues
---------- 0: employee2_id
---------- 1: employee3_id
---------- 2: employee4_id
---------- 3: employee5_id

Цель: Я хочу найти массив коллег по значению (например, employee3_id), а затем удалить эту запись. Если бы я мог изменить порядок списка (0,1,2 ...), было бы еще лучше.

Желаемый вывод, когда я хочу удалить employee3_id из списка коллег employee1.

<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 остается пустым после itemList = snapshot.val (); строка выполняется и весь проект очищается.

1 Ответ

0 голосов
/ 06 января 2019

Во-первых, если вы хотите получить данные только один раз, используйте once() вместо on(). on() устанавливает постоянный прослушиватель, который запускается несколько раз при изменении данных в любом месте под эталонным местоположением и продолжает срабатывать до тех пор, пока вы не удалите прослушиватель. Я уверен, что это не то, что вы хотите здесь.

Во-вторых, и once(), и on() являются асинхронными, то есть они возвращаются немедленно, а функция обратного вызова, которую вы ей передали, выполняется некоторое время спустя. Вы не знаете, сколько времени это займет. Это означает, что ваш код продолжит выполнение после once() или on(), не зная результата запроса. Вот почему ваш itemList пуст - это значение, которое вы изначально присвоили ему, и оно еще не изменилось.

Если вы хотите что-то сделать с результатами запроса, вы должны сделать это в самой функции обратного вызова или использовать обещание, возвращаемое once().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...