我试图在发出多个请求后调用一个函数。 loadEventsFromCalendar
函数发出访问每个日历的事件数据的请求,然后将其存储到json_event_list
。 renderTimeline
函数使用此大列表并基于此绘制可视化。
function loadFromAllCalendars(calendarNames){
var dfd_lst=[];
//Load events from all selected calendars
for (var i =0; i<calendarNames.length;i++){
dfd_lst.push(loadEventsFromCalendar(calendarNameIds[calendarNames[i]],calendarNames[i]));
}
$.when.apply($,dfd_lst).done(renderTimeline);
}
function loadEventsFromCalendar(calendarId,calendarName) {
var dfd = $.Deferred();
// Add events from calendar corresponding to the given calendarId into json_event_lst.
var request = gapi.client.calendar.events.list({
'calendarId': calendarId,
'timeMin': startdate.toISOString(),
'showDeleted': false,
'singleEvents': true,
'maxResults': 50,
'orderBy': 'startTime'
});
request.execute(function(resp) {
....data processing of json_event...
json_event_lst.push(json_event)
dfd.resolve();
return dfd.promise()
});
}
我尝试使用jquery延迟对象来检查是否满足promise,但是在填充数据数组之前仍会调用renderTimeline函数。
function loadFromAllCalendars(calendarNames){
var dfd_lst=[];
//Load events from all selected calendars
for (var i =0; i<calendarNames.length;i++){
dfd_lst.push(loadEventsFromCalendar(calendarNameIds[calendarNames[i]],calendarNames[i]));
}
$.when.apply($,dfd_lst).done(renderTimeline);
}
答案 0 :(得分:0)
使用promise all()
等待几个promise得到解决。
Promise.all([promise1, promise2, promise2]);
答案 1 :(得分:0)
延迟对象方法并不常用,因为即使请求未被执行(即函数中没有返回),也会将未定义的值存储到dfd_lst中,以某种方式使{{{ 1}}被执行。我最后通过在.done
中添加一个额外的布尔参数renderVis
来解决此问题,以指定是否渲染:
loadEventsFromCalendar