0
私は非同期ライブラリ(http://caolan.github.io/async/docs.html#map)を使用して、ノードアプリケーションでいくつかの非同期呼び出しを処理しています。私の問題は、asyncのmapメソッドを使用すると、すべてのiteratee関数が完了する前にメソッドのコールバックが呼び出されていることです。誰でも知っている理由は?iteratee関数が完了する前に非同期コールバックが呼び出される
ここでマップが呼び出されているコードです:
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内の各項目に対して呼び出されるiterateeコードです:
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
ありがとうございます!
てみてくださいとの始めに '(「iteratee関数内でコールバックコールに達する」)'はconsole.logを置く:
そして、あなたの非同期のfuncs上
を行いますgetEventsUpTo関数です。また 'callback(true)'という行が間違った場所にあります。 – SpiderPig