【发布时间】:2016-11-14 02:02:46
【问题描述】:
我正在使用异步库 (http://caolan.github.io/async/docs.html#map) 来处理节点应用程序中的一些异步调用。我的问题是,当我使用 async 的 map 方法时,在所有 iteratee 函数完成之前调用该方法的回调。有人知道为什么吗?
这是调用 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)
});
})
})
}
这是为 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
一点上下文:我正在使用地图从 Google 日历的 API 中检索日历事件列表。
谢谢!
【问题讨论】:
-
尝试将
console.log('reach callback call within iteratee function')放在getEventsUpTo函数的开头。并且callback(true)的行在错误的位置。
标签: javascript node.js asynchronous google-calendar-api