как присвоить запрошенное значение глобальной переменной? - PullRequest
0 голосов
/ 09 мая 2020

код для записи общего количества пользователей в определенном обществе

import * as functions from 'firebase-functions';

const admin = require('firebase-admin');
admin.initializeApp();

const db = admin.firestore();
export const new_reg = functions.firestore
    .document('mobile/{mobile}')
    .onCreate((change, context) =>{
        const society:String = change.get("society")
        let value = 1
        admin.firestore().doc(`society/${society}`).get()
        .then((userSnapshot: { data: () => { (): any; new(): any; users: number; }; }) => {
            value = userSnapshot.data().users
            console.log(value)
        })
        .catch((error: any) => {
            console.log(error)    
        })
        ++value
        console.log(value)
        return null
    })

значение "value" не обновляется кодом из строки 16 по 24.

примечание: - строка 18 предназначена только для подтверждения значения это воспринимается кодом.

значение, зарегистрированное в консоли строкой 18, всегда является правильным значением

значение, увеличивающееся в строке 24, является значением, которое я изначально объявил, а не тем, которое я получил из firestore.

1 Ответ

0 голосов
/ 09 мая 2020

get() немедленно возвращается с обещанием. Так что сделайте then и catch. Они асинхронны, и обратные вызовы вызываются через некоторое время с результатами запроса. Ваш код не будет ждать завершения запроса sh - он продолжит выполнение и будет увеличивать значение до завершения запроса.

С фоновыми триггерами Cloud Functions вы обязаны вернуть обещание, которое разрешается, когда вся асинхронная работа завершена . Прямо сейчас вы возвращаете null, который вообще не работает. Вместо этого вы должны вернуть обещание из цепочки, начинающейся с get().

return admin.firestore().doc(`society/${society}`).get()
    .then(...)
    .catch(...)

Мне непонятно, зачем вам нужно работать с value, но в любом случае вам придется иметь дело с обещаниями правильно.

...