Вот ваш виновник:
ref.child('employee').orderByChild('id').equalTo(id).once('value', snap => {
snap.forEach(data => {
key = data.key;
});
});
Этот бит кода асинхронный, что означает, что он не будет обработан сразу.Фактически, он скинет запрос, но затем с радостью перейдет к следующей вещи, которую он может обработать, а в вашем случае это return key
.Когда дело доходит до return key
, часть, которая фактически определяет значение ключа, еще не была обработана, поэтому вы получаете неопределенное значение.
private _findEmployeeById(id: number): Promise<string> {
const ref = this.db.database.ref();
let key: string;
return ref.child('employee').orderByChild('id').equalTo(id).once('value').then(snap => {
snap.forEach(data => {
key = data.key;
})
return key;
})
}
Это говорит, возвращает функцию, которая обещает вернуть значение, затем возвращает значение, когда оно разрешено.Вы заметите, что я обновил сигнатуру функции до обещания, которое в конечном итоге преобразуется в строку.Это будет иметь каскадные последствия для любого потребителя вашего метода.
Вместо:
const key = this._findEmployeeById(removeEmployee.id);
Вам нужно будет сделать
this._findEmployeeById(removeEmployee.id).then(key => {
console.log(key);
})
Я также добавлю, я никогда ничего не делалс помощью firebase, так что, возможно, есть лучший способ решить эту проблему, но в этом суть вашей проблемы.Стоит посмотреть, если вы не знакомы с циклом событий: https://www.youtube.com/watch?v=8aGhZQkoFbQ