#javascript #typescript
#javascript #typescript
Вопрос:
Я пытаюсь выполнить некоторую работу с облачными функциями в TypeScript, и у меня возникают проблемы с обещаниями.
const winnersObject = async (leagueId: string, round: string) : Promise<Object> => {
return new Promise(async function(resolve, reject) {
const winners: { [key: string]: any} = {};
return firestore
.collection('matches')
.where('leagueId', '==', leagueId)
.where('round', '==', round)
.where('status', 'in', finishedStatus)
.get()
.then((snapshot) => {
if (snapshot.empty) {
console.log('No matches');
reject();
} //No hay partidos finalizados
else {
//Define winner
snapshot.docs.forEach(async (doc) => {
if (doc.data().awayScore === doc.data().homeScore) { console.log('Tie'); winners[doc.data().matchId] = 3; }
else if (doc.data().homeScore > doc.data().awayScore) { console.log('Home win'); winners[doc.data().matchId] = 2; }
else if (doc.data().awayScore > doc.data().homeScore) { console.log('Away win'); winners[doc.data().matchId] = 1; }
});
resolve(winners);
}
}).catch((e) => console.log(e));
});
};
const getPicksDocuments = async (leagueId: string, round: string) : Promise<Array<Object>> => {
return new Promise(async function(resolve, reject) {
return firestore
.collection('picks')
.where('leagueId', '==', leagueId)
.where('round', '==', round)
.get()
.then((snapshot) => {
if (snapshot.empty) {
reject();
} //No picks
else { resolve(snapshot.docs); }
}).catch((e) => console.log(e));
});
};
Когда я пытаюсь вызвать эти функции следующим образом:
const winners = await winnersObject(leagueId, round);
console.log(winners, 'Finished matches');
Я получаю { undefined: 1 } 'Finished matches'
И при попытке
const allPicksDocs = await getPicksDocuments(leagueId, round);
console.log(allPicksDocs.length, 'Picks documents');
Я даже не получаю печать вообще.
Комментарии:
1. не ваша проблема, но
new Promise(async
=== запах кода — тем более, что вы никогда не используетеawait
в исполнителе обещаний — удалите этоasync
— иasync
вconst winnersObject = async (
, поскольку вы никогдаawait
нигде не используете эту функцию, И она возвращает обещание — фактически, в вашем первом блоке кода удалите ВСЕ,async
поскольку вы используете его там, где вам не нужно2. что касается вашей проблемы…
doc.data().matchId
не определено3. @JaromandaX отличный улов! Спасибо!! О вашем первом комментарии, просто чтобы убедиться, что я все понял правильно. Означает ли это, что асинхронность никогда не требуется, когда ваш возврат является обещанием?
4. Firestore намного лучше работает с RxJS, чем promises
5. функция синхронизации возвращает обещание по определению — проблема в том, что вы используете
async
безawait
… никогда не бывает причины создавать функциюasync
, если вы не хотите использоватьawait