javascript在多次异步函数调用后执行函数

时间:2017-01-07 07:24:29

标签: javascript jquery

我试图在发出多个请求后调用一个函数。 loadEventsFromCalendar函数发出访问每个日历的事件数据的请求,然后将其存储到json_event_listrenderTimeline函数使用此大列表并基于此绘制可视化。

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

2 个答案:

答案 0 :(得分:0)

使用promise all()等待几个promise得到解决。

Promise.all([promise1, promise2, promise2]);

答案 1 :(得分:0)

延迟对象方法并不常用,因为即使请求未被执行(即函数中没有返回),也会将未定义的值存储到dfd_lst中,以某种方式使{{{ 1}}被执行。我最后通过在.done中添加一个额外的布尔参数renderVis来解决此问题,以指定是否渲染:

loadEventsFromCalendar