Я создаю облачную функцию Firebase, которая опирается на некоторые данные о том, существуют ли определенные ключи в базе данных реального времени, но не возвращается должным образом.Он продолжает либо возвращать undefined
, либо Promise {}
.Вот функция, которую я пытаюсь вызвать:
async function checkMatchExists(baseUser: string, friend:string){
return await admin.database().ref('pairs/').child(baseUser).once("value",
snapshot => {
return snapshot.exists();
});
}
Если я попытаюсь вызвать функцию в моей основной функции следующим образом:
const exists = await checkMatchExists(userId, eachUserId)
Я получаю ошибку await expression is only allowed within an async function
.Это потому, что все это вложено в другой асинхронный метод Firebase:
await admin.database()
.ref(`locations/`).orderByChild('uid').once('value', userList =>{
let sentToUser;
userList.forEach(function(child){
/* where all the troubles are happening */
});
});
Итак, как я могу использовать оператор await
при вызове внешней функции без рисования этой ошибки?Есть ли способ вложить два await
звонка?Если нет, то как я могу получить данные из этой функции вовремя?
ОБНОВЛЕНИЕ: Я все еще не знаю, как правильно получить доступ к результату за пределами .then ().Я понимаю, что ожидание - это путь сюда, но опять же, я не могу использовать ожидание в другом ожидании.
Спасибо всем за помощь.Это было определенно из-за путаницы из-за разницы между обратными вызовами и методом async / await.Вот что я изменил в своей функции:
async function checkMatchExists(baseUser: string, friend:string){
try{
const snapshot = await
admin.database().ref('pairs/').child(baseUser).once("value")
console.log("Does the snapshot exist?")
console.log(snapshot.exists())
return snapshot.exists()
}
catch(e) {
console.log(e)
return e
}
}
А вот как я правильно ее называю в облачной функции Firebase:
const doesExist = checkMatchExists(eachUserId, userId)
.catch(err => console.error(err))
.then(result => console.log("result: " + String(result)))
.catch(() => 'obligatory catch')