Firebase функции - Использование async / await с функцией Once () - PullRequest
0 голосов
/ 07 мая 2018

Я довольно новичок в машинописи, и мне уже удалось справиться с этим, но я обнаружил странную ошибку / ошибку, которую не могу найти с помощью async / await.

У меня есть следующий фрагмент кода, и моя проблема в том, что предложение 'await' не работает с функцией .once ().

async function testFunction(deviceID:string){
    const returnObject:{name:string, description:string, tokens:string[]}[] = [];

    const deviceRef = admin.database().ref('deviceInfo/').orderByChild('id').equalTo(deviceID);

    await deviceRef.once('value', async (payload) => {
        const pushObject:{name:string, description:string, tokens:string[]} = {name:"", description:"", tokens:[]};
        if(payload.exists()){
            const devices = payload.val();
            const keys = Object.keys(devices);

            for(const key of keys){
                pushObject.name = devices[key].name;
                pushObject.description = devices[key].description;
                pushObject.tokens = await getTokens(key);
                returnObject.push(pushObject);

            }
            console.log("Return Object 1:", returnObject);
            return returnObject;

        }
        else{
            return null;
        }

    })
    console.log("Return Object 2:", returnObject);
    return returnObject;
}

Эта функция всегда возвращает {name: "", description: "", tokens: []}, даже если в начале моей функции deviceRef.once () у меня есть 'await'.

Также оба console.logs печатают, «Return Object 1» печатает правильный объект со всеми данными, полученными из БД, но «Return Object 2» печатает пустой массив. Итак, ясно, что ожидание не ожидает завершения функции Once (), я просто не уверен, почему это так?

Буду признателен за любую помощь или совет

1 Ответ

0 голосов
/ 07 мая 2018

При использовании Once () вы выбираете один из двух вариантов:

  1. Используйте возвращенное обещание для получения данных из запроса.
  2. Передайте функцию обратного вызова в качестве второгоаргумент для получения данных из запроса.

Если вы собираетесь использовать async / await, я бы выбрал вариант 1. Прямо сейчас похоже, что вы используете комбинацию 1и 2. Не беспокойтесь о передаче функции обратного вызова в Once (), если вы собираетесь использовать обещание, которое оно возвращает.Это побеждает цель использования async / await.

const payload = await deviceRef.once('value')
if (payload.exists()) { ... }
...