выполнение запросов в firebase с использованием async/await

признавая, что firebase добавила поддержку промисов, есть ли способ запустить запрос, подобный следующему, внутри функции async?:

const eventref = this.db.ref('cats/whiskers');
const value = await eventref.once('value')

Выполнение вышеприведенного возвращает обещание для value, я надеюсь получить большой двоичный объект json, который хранится в cats/whiskers.


person fox    schedule 01.05.2017    source источник
comment
Да почему нельзя? Ты это пробовал? У вас есть проблемы?   -  person Bergi    schedule 01.05.2017
comment
Как уже упоминалось, приведенное выше возвращает обещание, а не значение.   -  person fox    schedule 01.05.2017
comment
Хм, это невозможно, await не может возвращать значки. Используете ли вы транспилятор? Вы проверили, как выглядит eventref.once('value') в отладчике?   -  person Bergi    schedule 01.05.2017
comment
да, по какой-то причине я вставил вызов .val() в оператор ожидания, у меня это тоже сработало.   -  person fox    schedule 01.05.2017
comment
.once работает, но .on (поэтому someRef.on('child_added')) ожидает второй аргумент. Любые идеи для этого?   -  person Karoh    schedule 06.05.2017
comment
.on не возвращайте обещание.   -  person Emerica    schedule 01.12.2018


Ответы (1)


Результатом value является снимок, нам нужен еще 1 шаг, чтобы получить значение. Это должно быть так:

const eventref = this.db.ref('cats/whiskers');
const snapshot = await eventref.once('value');
const value = snapshot.val();
person Hank Phung    schedule 08.12.2017
comment
Меня вообще спасли! - person zeckdude; 02.09.2018
comment
Что, если вам нужно будет использовать значение впоследствии, скажет ли это вашему коду подождать, пока value будет назначено что-то, прежде чем продолжить? - person Badrush; 04.12.2018
comment
@Badrush для справки firebase.google.com/docs/reference /js/ - person Hank Phung; 05.12.2018
comment
Событие @Badrush value можно использовать для получения текущего значения определенного узла в вашей базе данных с помощью once или для подписки на изменения в определенном узле в вашей базе данных с помощью on. - person Hank Phung; 05.12.2018
comment
Я имею в виду. Допустим, мне нужно получить снимок и сохранить его внутри var A... тогда у меня есть код, который берет var A и отображает его. Есть ли способ сказать моему коду, чтобы он дождался завершения получения моментального снимка, чтобы var A не было undefined? Я знаю, что вы можете использовать .then, но иногда это делает код очень грязным. Особенно, если var A используется в коде намного позже. - person Badrush; 05.12.2018
comment
@Badrush, вы можете просто использовать await: var A = await eventref.once('value');, потому что то, о чем вы говорите, это именно то, что делает await. - person Hank Phung; 06.12.2018
comment
Спасибо. Будет ли он по-прежнему обрабатывать код, который не требует var A в этом примере? - person Badrush; 06.12.2018
comment
@ShajeelAfzal просто оберните блок в try-catch - person Hank Phung; 21.10.2019