Обещания в TypeScript

#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