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

javascript在多次异步函数调用后执行函数,javascript,jquery,Javascript,Jquery,我试图在发出多个请求后调用函数。loadEventsFromCalendar函数发送访问每个日历的事件数据的请求,然后将其存储到json\u event\u列表中。renderTimeline函数获取这个大列表并在此基础上绘制可视化 function loadFromAllCalendars(calendarNames){ var dfd_lst=[]; //Load events from all selected calendars for (var i =0; i&

我试图在发出多个请求后调用函数。
loadEventsFromCalendar
函数发送访问每个日历的事件数据的请求,然后将其存储到
json\u event\u列表中。
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()
    });
  }
函数加载来自所有日历(日历名称){
var dfd_lst=[];
//从所有选定日历加载事件
对于(var i=0;i使用promise
all()
等待多个承诺得到解决

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

延迟对象方法不能很好地工作,因为即使请求没有执行(即函数中没有返回),然后将一个未定义的值存储到DFDlst中,以某种方式执行
.done
。我通过在
loadEventsFromCalendar
中添加一个额外的布尔参数
renderVis
来解决此问题,以指定是否渲染:

function loadEventsFromCalendar(calendarId,calendarName,renderVis=false) {
    // 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){
        ....
        ....
        if (renderVis){
            renderTimeline();
        } 
    }
}

renderTimeline
是否希望传递参数?解决方案是不使用
$.when()
$.Deferred(),
Deferred.done()
?是的,布尔参数是一种解决方法,不需要使用延迟对象。在使用
$的问题中,答案与实际的
javascript
有什么关系?
function loadEventsFromCalendar(calendarId,calendarName,renderVis=false) {
    // 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){
        ....
        ....
        if (renderVis){
            renderTimeline();
        } 
    }
}