【问题标题】:Using async to handle promise from Google Calendar API使用异步处理来自 Google Calendar API 的承诺
【发布时间】:2020-06-10 18:40:45
【问题描述】:

我正在努力处理对 Google Calendar API 的调用。根据我的需要,我稍微修改了 Google API 文档中的 Node.js 快速入门。我正在尝试从日历中检索所有事件,但是当我尝试等待返回时,我得到的只是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,事件最终会记录到控制台,我只是不知道如何让函数在返回之前等待该承诺解决。

【问题讨论】:

  • 您好,欢迎来到 SO。我认为你想说的是,由于调用listEvents,你得到了Promise { &lt;pending&gt; }。那是对的吗?如果是这样,那是因为listEvents 被标记为asycn 函数。所有async 函数都隐式返回Promise。所以,你需要await你的listEvents打电话,或者打电话给.then就可以了。此外,除非您有意尝试抛出网络错误,否则您永远不需要执行return await,因为如上所述,使用async 无论如何都会将函数返回包装在Promise 中。
  • 那么你的 aync 函数显然会返回一个 `Promise {}`,使用 .then() 让它在解决后显示事件?
  • 谢谢。是的,它正在返回 Promise { &lt;pending&gt; } 。原始示例没有返回任何内容,只是记录了结果。我在第 1 行添加了async,在第 3 行添加了await,在底部添加了return events。我假设它返回的未决承诺是对 calendar.events.list() 的调用,因为当我删除 async/await 时,它返回 undefined(悬停在 .list() 上表示这是一个 GaxiosPromise)。如果我加了.then(),那会是listEvents().then(&lt;do something with the return&gt;)吗?

标签: javascript node.js google-api-nodejs-client


【解决方案1】:

这是我用来获取日历事件的 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,这将使函数的返回类型为Promise&lt;calendar_v3.Schema$Event[]&gt;

现在,无论您在何处调用该函数,都可以使用await 或.then() 来获取日历事件

【讨论】:

  • 谢谢。我不熟悉 TS,但我确实尝试将其转换回 vanillaJS
  • 值得学习。 Typescript 可以很容易地避免此类问题。
【解决方案2】:

您正在尝试将 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.');
    }
}

【讨论】:

  • 嗯,这还是给了我Promise { &lt;pending&gt; }
  • 您的意思是res 正在等待处理?或 listEvents 的响应?如果它是返回承诺的 listEvents,那么这是一种期望的行为。您需要等待或使用 then
  • 我应该澄清一下,我试图 console.log(listEvents()) 现在看起来很明显它不是一个异步函数。此外,这是一个由 express 调用的模块:app.get('/events', async (req, res) =&gt; { let asyncResponse = await getEvents(); res.send(asyncResponse) }); 现在,使用 Postman,我得到了正确的 JSON!非常感谢!
猜你喜欢
  • 2017-01-22
  • 2021-06-21
  • 1970-01-01
  • 2018-09-25
  • 2017-04-17
  • 2020-03-22
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
相关资源
最近更新 更多