2016-11-13 6 views
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

ありがとうございます!

+0

てみてくださいとの始めに '(「iteratee関数内でコールバックコールに達する」)'はconsole.logを置く:

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

そして、あなたの非同期のfuncs上

を行いますgetEventsUpTo関数です。また 'callback(true)'という行が間違った場所にあります。 – SpiderPig

答えて

0

が登録されているすべてのコールバックがのときtrueを返します。あなたは、コールバックを実行するコールバックを必要とする:

call(1); 
registercallback(()=>{call()}); 
関連する問題