Calendar.events.lists回调参数没有被调用。

问题描述 投票:0回答:1

我正在使用Dialogflow构建聊天机器人。我想把它和Google日历整合在一起,我按照youtube上的Google官方教程进行了操作。我的代码如下。

function makeAppointment (agent) {
  // Calculate appointment start and end datetimes (end = +1hr from start)
  //console.log("Parameters", agent.parameters.date);
  const appointment_type = agent.parameters.AppointmentType;
  const dateTimeStart = new Date(Date.parse(agent.parameters.date.split('T')[0] + 'T' + agent.parameters.time.split('T')[1].split('-')[0] + timeZoneOffset));
  const dateTimeEnd = new Date(new Date(dateTimeStart).setHours(dateTimeStart.getHours() + 1));
  const appointmentTimeString = dateTimeStart.toLocaleString(
    'en-US',
    { month: 'long', day: 'numeric', hour: 'numeric', timeZone: timeZone }
  );

  // Check the availibility of the time, and make an appointment if there is time on the calendar
  var result = undefined;
  var not_needed = createCalendarEvent(dateTimeStart, dateTimeEnd, appointment_type).then(() => {
    agent.add(Ok, let me see if we can fit you in. ${appointmentTimeString} is fine!.);
    result = 1;
  }).catch(() => {
    agent.add(I'm sorry, there are no slots available for ${appointmentTimeString}.);
    result = 1
  });

  while(result == undefined) continue;
  return not_needed;
}

  function createCalendarEvent (dateTimeStart, dateTimeEnd, appointment_type) {
    return new Promise((resolve, reject) => {
      calendar.events.list({
        auth: serviceAccountAuth, // List events for time period
        calendarId: calendarId,
        timeMin: dateTimeStart.toISOString(),
        timeMax: dateTimeEnd.toISOString()
      }, (err, calendarResponse) => {
        // Check if there is a event already on the Calendar
        if (err || calendarResponse.data.items.length > 0) {
          reject(err || new Error('Requested time conflicts with another appointment'));
        } else {
          // Create event for the requested time period
          calendar.events.insert({ auth: serviceAccountAuth,
            calendarId: calendarId,
            resource: {summary: appointment_type +' Appointment', description: appointment_type,
              start: {dateTime: dateTimeStart},
              end: {dateTime: dateTimeEnd}}
          }, (err, event) => {
            err ? reject(err) : resolve(event);
          }
          );
        }
      });
    });
  }

响应中没有任何内容,所以我创建了一个无限循环,等待承诺得到解决或拒绝。因为比云函数在60秒后被超时,因为while循环从未中断。为什么传递给 calendar.event.lists 的回调从未被调用?

谢谢您

javascript google-api google-calendar-api dialogflow es6-promise
1个回答
1
投票

Dialogflow库是知道承诺的。事实上,它是如此的了解他们,以至于你可以 必须 如果你在你的Handler函数中进行任何异步操作,它将返回一个Promise。它将等待Promise被解析后再发送任何东西回来。

由于 createCalendarEvent() 已经返回了一个Promise,你可以将这个Promise从 makeAppointment().

你不需要 while 循环--事实上,这可能是工作不正常的一个重要原因。由于node是单线程的,线程从来没有离开while循环来处理Promise,所以 result 实际上永远不会被设置为1。

此外,你可能不需要将调用的内容包装成 calendar.events.list()calendar.events.insert() 里面 new Promise(). 如果你没有为这些函数提供回调函数,它们将返回一个Promise,你可以用标准的ncatch块或 await(如果你使用的是足够现代的node版本)来处理它们。

© www.soinside.com 2019 - 2024. All rights reserved.