Параметр обратного вызова Calendar.events.lists не вызывается - PullRequest
0 голосов
/ 01 мая 2020

Я создаю чат-бота, используя Dialogflow. Я хотел интегрировать его с Календарем Google, я следовал официальному руководству Google по YouTube. Мой код выглядит следующим образом:

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);
          }
          );
        }
      });
    });
  }

В ответе ничего нет, поэтому я создал бесконечное время l oop, которое ожидает разрешения или отклонения обещания. С тех пор функция облака перестает работать через 60 секунд, поскольку l oop никогда не прерывается. Почему обратный вызов не передается в calendar.events.lists?

Спасибо

1 Ответ

1 голос
/ 01 мая 2020

Библиотека Dialogflow знает об обещаниях. На самом деле, они настолько осведомлены о них, что вы должны вернуть обещание, если вы выполняете какие-либо асинхронные операции в своей функции-обработчике. Он будет ждать разрешения Обещания, прежде чем отправит что-либо обратно.

Поскольку createCalendarEvent() уже возвращает Обещание, вы можете вернуть это Обещание с makeAppointment().

Вы не нужен while l oop - на самом деле, это, вероятно, большая часть того, что не работает. Так как узел является однопоточным, поток никогда не покидает время l oop для обработки Promise, поэтому result никогда не будет установлен на 1.

Кроме того, вам, вероятно, не нужно переносить вызовы calendar.events.list() и calendar.events.insert() внутри new Promise(). Если вы не предоставите функцию обратного вызова для них, они вернут Promise, и вы можете обрабатывать их стандартными блоками then / catch или await (если вы используете достаточно современную версию узла).

...