2016-11-13 5 views
0

Я использую библиотеку async (http://caolan.github.io/async/docs.html#map) для обработки некоторых моих асинхронных вызовов в приложении-узле. Моя проблема заключается в том, что, когда я использую метод map async, вызов вызова метода вызывается до того, как все функции iterate будут завершены. Кто-нибудь знает, почему?Вызов вызова Async перед выполнением функций iterate

Вот код, где карта называют:

function divvy(email, project, oauth2Client, callback) { 
    getUserPreferences(email, (preferences) => { 
    calendars.getCalendars(oauth2Client, (calendars) => { 
     var calendarIds = calendars.map(function(obj) { return obj.id }) 
     console.log('length of calendarIds is: '+calendarIds.length) 
     asyncMap(calendarIds, events.getEventsUpTo.bind(null, project.end, oauth2Client), function(err, results) { 
     // results is now an array of arrays. 
     // Each array within results is an array of events per calendarList 
     console.log('final callback is called') 
     callback(true) 
     }); 
    }) 
    }) 
} 

А вот iteratee код вызывается для каждого элемента в calendarIds:

function getEventsUpTo (projectEnd, oauth2Client, calendarId, callback) { 
    calendar.events.list({ 
    auth: oauth2Client, 
    calendarId: calendarId, 
    timeMin: (new Date()).toISOString(), 
    timeMax: projectEnd.toISOString(), 
    maxResults: 10, 
    singleEvents: true, 
    orderBy: 'startTime', 
    }, (err, response) => { 
    if (err) { 
     // console.error('The API returned: ' + err) 
     console.log('reach callback call within iteratee function') 
     callback(null, null) 
    } else { 
     var events = response.items 
     if (events.length === 0) { 
     callback('No upcoming events') 
     } else { 
     console.log('reach callback call within iteratee function') 
     callback(null, events) 
     } 
    } 
    }) 
} 

Наконец, вот вывод на консоль:

length of calendarIds is: 6 
reach callback call within iteratee function 
reach callback call within iteratee function 
reach callback call within iteratee function 
final callback is called 
reach callback call within iteratee function 
reach callback call within iteratee function 

Немного контекста: я использую карту для извлечения списков событий календаря из API Календаря Google.

Спасибо!

+0

Try и положить 'console.log («достигает обратный вызов в пределах iteratee функции»)' в начале функция getEventsUpTo. Также строка 'callback (true)' находится не в том месте. – SpiderPig

ответ

0

Вы возвращаете true, когда все обратные вызовы, где зарегистрированы. Вы должны обратные вызовы, которые выполняют свой обратный вызов:

var counter=0; 
function call(number=-1){ 
    counter +=number; 
    if(counter==0){ 
    alert("finished"); 
    }} 

И на вашем асинхронном funcs сделать:

call(1); 
registercallback(()=>{call()}); 
Смежные вопросы