【问题标题】:How can I count the number of events in the google calendar API in node js?如何计算节点 js 中谷歌日历 API 中的事件数?
【发布时间】:2020-06-07 15:37:34
【问题描述】:

我正在使用 dialogflow 来构建和聊天机器人,并将它与 Google 日历集成。我已经能够预约,但我的问题是我想计算一个时间间隔内出现的事件数量。我可以使用以下代码在日志中写入正确的值来做到这一点:

  function get_events(dateTimeStart1,dateTimeEnd1){
    calendar.events.list({  // List all events in the specified time period
      auth: serviceAccountAuth,
      calendarId: calendarId,
      timeMin: dateTimeStart1.toISOString(),
      timeMax: dateTimeEnd1.toISOString()
    }, (err,res) => {
    const events = res.data.items;
      const number_events = events.length;
      console.log(number_events);
    });
  }

问题是我想返回number_events 以将其用于其他目的,但我不知道该怎么做。

我想做这样的事情。

  function get_events(dateTimeStart1,dateTimeEnd1){
    calendar.events.list({  // List all events in the specified time period
      auth: serviceAccountAuth,
      calendarId: calendarId,
      timeMin: dateTimeStart1.toISOString(),
      timeMax: dateTimeEnd1.toISOString()
    }, (err,res) => {
    const events = res.data.items;
      const number_events = events.length;
      console.log(number_events);
    });
  return number_events;
  }

你能帮帮我吗?谢谢

【问题讨论】:

    标签: node.js function events google-calendar-api


    【解决方案1】:

    这个答案怎么样? calendar.events.list 返回 Promise。所以可以如下修改。

    修改脚本:

    在本次修改中,假设get_events在函数run中被调用。

    async function get_events(dateTimeStart1,dateTimeEnd1){
      const res = await calendar.events.list({
        auth: serviceAccountAuth,
        calendarId: calendarId,
        timeMin: dateTimeStart1.toISOString(),
        timeMax: dateTimeEnd1.toISOString(),
      });
      const events = res.data.items;
      const number_events = events.length;
      return number_events;
    }
    
    async function run() {
    
      // do something
    
      const res = await get_events(dateTimeStart1, dateTimeEnd1);
      console.log(res);
    
      // do something
    
    }
    

    参考:

    补充:

    虽然我不确定这是否是你所期望的方向,但当不使用async functions时,下面的脚本怎么样?

    function get_events(dateTimeStart1, dateTimeEnd1) {
      return new Promise((resolve, reject) => {
        calendar.events.list(
          {
            auth: serviceAccountAuth,
            calendarId: calendarId,
            timeMin: dateTimeStart1.toISOString(),
            timeMax: dateTimeEnd1.toISOString(),
          },
          (err, res) => {
            if (err) reject(err);
            const events = res.data.items;
            const number_events = events.length;
            resolve(number_events);
          }
        );
      });
    }
    
    function run(creds) {
      // do something
    
      get_events(calendar, dateTimeStart1, dateTimeEnd1).then((res) =>
        console.log(res)
      );
    
      // do something
    }
    

    【讨论】:

    • 问题是我正在使用 Dialogflow 并且它报告错误:“异步函数”仅在 es8 中可用(使用“esversion 8”)。有没有办法在没有异步函数的情况下做同样的事情?
    • @Luca Di Narzo 感谢您的回复。我带来的不便表示歉意。我更新了我的答案。你能确认一下吗?如果这不是您期望的方向,我再次道歉。
    • 感谢您的回答。实际上,您发布的函数会将正确的值写入日志,但不允许我使用此变量“number_events”。它返回给我一个[对象承诺]。我的目标是使用“number_events”作为while循环的条件。特别是我想设置:while (number_events > 0) do something.
    • @Luca Di Narzo 感谢您的回复。根据您的问题,我没有注意到您想在循环中使用 calendar.events.list 。我为我糟糕的英语水平道歉。当您想在循环中使用calendar.events.list 时,需要使用async functions。这个怎么样?
    • 感谢您的回答。在 dialogflow 中无法使用异步函数,因为它返回错误,所以我无法使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2018-04-30
    • 2018-09-13
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多