Использование asyn c для обработки обещаний из API Календаря Google - PullRequest
0 голосов
/ 26 февраля 2020

Я борюсь с обработкой вызова API Календаря Google. Я немного изменил Node.js быстрый старт из документации Google API для своих нужд. Я пытаюсь получить все события из календаря, но когда я пытаюсь дождаться возврата, все, что я получаю, это Promise { <pending> }. Есть ли лучший способ дождаться звонка или я что-то упускаю?

async function listEvents() {
  const calendar = google.calendar({version: 'v3', auth: apiKey});
  return await calendar.events.list({
    calendarId: <calendarID>,
    timeMin: oneWeekAgo,
    maxResults: 10,
    singleEvents: true,
    orderBy: 'startTime',
  }, (err, res) => {
    if (err) return console.log('The API returned an error: ' + err);
    const events = res.data.items;
    if (events.length) {
      events.forEach(el => console.log(el.summary))
      // console.log(events)
      // eventList = events
      return events
    } else {
      console.log('No upcoming events found.');
    }
  });
}

FWIW, события в конечном итоге регистрируются на консоли, я просто не могу понять, как получить функция ожидания разрешения этого обещания перед возвратом.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Вы пытаетесь использовать await со стилем обратного вызова. Я предполагаю, что если вы просто удалите функцию обратного вызова и поставите await, она вернет вам детали

async function listEvents() {
  const calendar = google.calendar({version: 'v3', auth: apiKey});
  const res = await calendar.events.list({
    calendarId: <calendarID>,
    timeMin: oneWeekAgo,
    maxResults: 10,
    singleEvents: true,
    orderBy: 'startTime',
  });
  const events = res.data.items;
    if (events.length) {
      events.forEach(el => console.log(el.summary))
      // console.log(events)
      // eventList = events
      return events
    } else {
      console.log('No upcoming events found.');
    }
}

0 голосов
/ 26 февраля 2020

Это код TypeScript, который я использую для извлечения событий календаря

let results: GaxiosResponse<calendar_v3.Schema$Events>;
const maxResults: any = process.env.MAX_CALENDAR_RESULTS;
try {
    this.logger.info('Fetching events for primary calendar id');

    results = await gcalClient.events.list({
        calendarId: 'primary',
        timeMin: (new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString()),
        maxResults,
        singleEvents: true,
        orderBy: 'startTime'
     });
     this.logger.info('Successfully fetched calendar events');
} catch (err) {
    this.logger.error('Error encountered while fetching events');
    this.logger.error(err);
    return err;
}
// Extract the Calendar Events from the response received
const eventList: calendar_v3.Schema$Event[] = results.data.items;

Вы можете добавить это в функцию async и вернуть eventList, что сделает тип возврата функции be Promise<calendar_v3.Schema$Event[]>

Теперь, где бы вы ни вызывали функцию, используйте await или .then(), чтобы получить события календаря

...