如何使用AngularJS保证使用map()函数链接所有结果

时间:2017-09-15 14:29:49

标签: angularjs typescript google-api google-calendar-api

我无法确定通过Google API获取数据的正确方法。

以下是示例:我有一个带控制器和服务的组件:

在我的控制器中,我有一个调用服务来获取数据的方法:

getCalendarEvents() {
    this.service.getCalendarEvents().then(events => {
        this.calendarEvents = events;
        //this.$scope.$apply();
    });
}

在我的服务中,我有一个同名的方法来检索数据:

getCalendarEvents() {
    return gapi.client.calendar.calendarList.list().then(response => {
        if (response.result.items === undefined) return [];
        let requests = response.result.items.map(calendar => {
            let params = { calendarId: calendar.id, timeMin: (new Date()).toISOString(), showDeleted: false, singleEvents: true, maxResults: 10 };
            return gapi.client.calendar.events.list(params)
                .then(response => {
                    let events: any = response.result.items;
                    return events.map(event => {
                        let calendarEvent: CalendarEvent = {
                            id: event.id,
                            summary: event.summary,
                            htmlLink: event.htmlLink,
                            start: new Date(event.start.date == undefined ? event.start.dateTime == undefined ? '' : event.start.dateTime : event.start.date),
                            end: new Date(event.end.date == undefined ? event.end.dateTime == undefined ? '' : event.end.dateTime : event.end.date)
                        };
                    });
                });

        });
        return this.$q.all(requests);
    });
}

它的作用是首先调用Google API以检索当前用户的所有日历:

gapi.client.calendar.calendarList.list()

然后,对于返回列表中的每个日历,我需要调用以通过calendar.id属性检索与此日历关联的事件作为发送请求以获取事件的参数:

gapi.client.calendar.events.list(params)

所有这些电话都是基于承诺。 我需要向控制器返回一个承诺,该承诺将返回所有日历的所有事件。

所以,让我们说,我有3个日历:我的日历(A),我的兄弟日历(B)和生日日历(C)。 因此,如果我在日历A中有5个事件,在日历B中有3个事件,在日历C中有2个事件,我必须一起返回一个包含10个事件的事件。

我正在使用map()函数将响应组合在一起,但在我的控制器中,我收到了3个事件数组(3个日历)。相反,我想收到一个包含10个事件的数组,正如我之前所解释的那样。

我做错了什么?

A general purpose JSON browser routine

enter image description here

0 个答案:

没有答案