Node.JS Google Calendar Обещание возврата списка событий - PullRequest
0 голосов
/ 08 июня 2018

В настоящее время у меня есть приложение NodeJS, в котором я хочу получить список событий и после этого создать с ним структуру данных, но мое обещание не ждет возврата функции, вот код:

Это должно дождаться возврата 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, но ничего не получалось.Заранее спасибо.

1 Ответ

0 голосов
/ 08 июня 2018

Итак, способ вызова метода getEvents в этом первом фрагменте кода предполагает, что вы ожидаете, что Promise будет возвращен из getEvents.Но вы на самом деле ничего не возвращаете.Я не очень хорошо знаю API календаря Google, и listEventsIntervalAPI вполне может вернуть Обещание, но вы его не возвращаете.Если вы пытаетесь вернуть только заполненный массив na, проблема в том, что у вас есть return na; в теле метода обратного вызова, что означает, что контекст этого оператора возврата равен для этого Метод обратного вызова, а не для самого метода getEvents.

Существует несколько способов решить эту проблему, но хороший способ сохранить то, что у вас уже есть, - это вернуть Promise из самой функции getEvents.Это может выглядеть следующим образом:

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

Вы можете позвонить reject() в Обещании, если у вас есть ошибка, которую вы хотите обработать, и resolve() в противном случае.

MDN Ссылка

...