gpt4 book ai didi

javascript - Calendar.events.lists 回调参数不会被调用

转载 作者:行者123 更新时间:2023-12-02 20:53:24 25 4
gpt4 key购买 nike

我正在使用 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);
}
);
}
});
});
}

响应中没有任何内容,因此我创建了一个无限 while 循环,等待 promise 得到解决或拒绝。由于 while 循环永远不会中断,因此云函数在 60 秒后超时。为什么传递给 calendar.events.lists 的回调从未被调用?

谢谢

最佳答案

Dialogflow 库了解 Promise。事实上,它非常了解它们,因此如果您在 Handler 函数中执行任何异步操作,您必须返回 Promise。它将等待 Promise 得到解决,然后再发送回任何内容。

由于 createCalendarEvent() 已经返回 Promise,因此您可以从 makeAppointment() 返回此 Promise。

您不需要 while 循环 - 事实上,这可能是不起作用的很大一部分。由于节点是单线程的,线程永远不会离开 while 循环来处理 Promise,因此 result 实际上永远不会设置为 1。

此外,您可能不需要将对 calendar.events.list()calendar.events.insert() 的调用包装在 中新的 Promise() 。如果您没有为这些提供回调函数,它们将返回一个 Promise,您可以使用标准的 then/catch block 或等待来处理它们(如果您使用的是足够现代的节点版本)。

关于javascript - Calendar.events.lists 回调参数不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61548181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com