2016-11-13 145 views
0

我正在使用异步库(http://caolan.github.io/async/docs.html#map)来处理节点应用程序中的一些异步调用。我的问题是,当我使用异步的映射方法时,在完成所有迭代函数之前调用方法的回调函数。有人知道为什么在迭代函数完成之前调用异步回调

这里就是地图被调用的代码:

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 

有点上下文:我使用map来检索日历事件列表Google日历的API。

谢谢!

+0

尝试,并把'的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()}); 
相关问题