2017-01-07 3 views
0

Я пытаюсь вызвать функцию после отправки нескольких запросов. Функция loadEventsFromCalendar отправляет запросы на получение данных о событиях для каждого календаря, а затем сохраняет их в json_event_list. Функция renderTimeline принимает этот большой список и рисует визуализацию, основанную на этом.Функция выполнения javascript после нескольких асинхронных вызовов функций

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 отложенного объекта, чтобы проверить, если обещания будут выполнены, но функция 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

ли 'renderTimeline' ожидать параметр будет принят? – guest271314

ответ

0

Используйте обещание all(), чтобы подождать, пока не будут решены некоторые обещания.

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

Методы отсроченные объект не совсем работает, потому что даже если запрос не был выполнен (т.е. нет возврата в функции) неопределенное значение затем сохраняется в dfd_lst, который каким-то образом делает .done получает казнены. Я в конечном итоге решение этого вопроса, добавив дополнительный параметр Boolean renderVis в loadEventsFromCalendar, чтобы указать, следует ли предоставлять или нет:

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(); 
     } 
    } 
} 
+0

Решение заключалось в том, чтобы не использовать '$ .when()', '$ .Deferred()', 'deferred.done()'? – guest271314

+0

Да, параметр Boolean был обходным путем, который не требовал использования отложенного объекта. – ROBOTPWNS

+0

Как ответ связан с фактическим 'javascript' в вопросе, где используются' $ .when() ',' $ .Deferred() '? – guest271314

Смежные вопросы