gpt4 book ai didi

javascript - Node.JS Google Calendar Promise 返回事件列表

转载 作者:行者123 更新时间:2023-11-29 23:20:49 25 4
gpt4 key购买 nike

我目前有一个 NodeJS 应用程序,我想在其中获取事件列表,然后用它创建一个数据结构,但我的 promise 不是等待函数的返回,这是代码:

这应该等待 getEvents 返回,然后记录收到的值

console.log("Schedule");
scheduler.getEvents(searchRange)
.then((value) => {
console.log("value");
console.log(value);
});

这是getEvents 函数,它使用日历api 获取客户端日历上的事件列表,它应该返回na,但它实际上在日历api 返回列表之前返回。

async function getEvents(searchRange) {
let na = [];

calendarAPI.listEventsIntervalAPI(searchRange.startDate, searchRange.endDate, (events) => {
events.forEach((event) => {
na.push({
start: moment(event.start.timeDate),
end: moment(event.end.timeDate)
});
});
return na;
});
}

最后是获取日历事件列表的 API 调用:

async function listEventsIntervalAPI(dI, dE, callback) {
let dateInitial = moment(dI).toDate();
let dateEnd = moment(dE).toDate();

const calendar = google.calendar({ version: 'v3' });
calendar.events.list({
auth: oauth2Client,
calendarId: 'primary',
timeMin: dateInitial.toISOString(),
timeMax: dateEnd.toISOString(),
maxResults: 10,
singleEvents: true,
orderBy: 'startTime',
}, (err, { data } = {}) => {
if (err) {
return console.log('The API returned an error: ' + err);
}

const events = data.items;
if (events.length) {
callback(events);
} else {
console.log('No upcoming events found.');
callback(events);
}
});
}

我的问题是为什么没有正确等待返回?我知道 calendar.list 不是异步的,但有没有办法让我等待返回并实际同步执行此操作?我尝试在 func 调用中插入回调,或者只是转为异步并使用 await,但都没有用。提前致谢。

最佳答案

因此,您在第一段代码中调用 getEvents 方法的方式表明您期望从 getEvents 返回一个 Promise。但你实际上并没有真正归还任何东西。我不太了解 Google 日历 API,listEventsIntervalAPI 很可能会返回一个 Promise,但您不会返回它。如果您试图只返回填充的 na 数组,问题是您在回调方法的主体中有 return na;,这意味着该 return 语句是用于该回调方法,而不是用于 getEvents 方法本身。

有多种方法可以解决此问题,但与现有内容保持一致的一个好方法是从 getEvents 函数本身返回一个 Promise。它可能看起来像这样:

async function getEvents(searchRange) {
return new Promise((resolve, reject) => {
calendarAPI.listEventsIntervalAPI(searchRange.startDate, searchRange.endDate, (events) => {
if (!events) {
reject("No events returned");
}

let na = [];
events.forEach((event) => {
na.push({
start: moment(event.start.timeDate),
end: moment(event.end.timeDate)
});
});
resolve(na);
});
});
}

当您遇到要处理的错误时,您需要在 Promise 中调用 reject(),否则调用 resolve()

MDN Reference

关于javascript - Node.JS Google Calendar Promise 返回事件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50763385/

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