javascript - Callback after multiple asynchronous calls? -
i'm using gmail api retrieve messages in loop , req.write() each message. there's callback each api invocation, how know when whole set done can end response? tried following noticed callbacks not executed in order of array index can't line commented out.
for (var = 0; < messages.length; i++) { var message = messages[i]; console.log('- %s', message.id); (function(e){ var request = gmail.users.messages.get({ auth:auth, id:message.id, userid: 'me' }, function(err, response) { if(err) { console.log('api returned error: ' +err); return; } res.write(json.stringify(response,null,'\t')); console.log(e); //if(e==messages.length-1) res.end(); } ); })(i); }
you're on right track, though. since won't any callbacks until loop completed, can keep track of how many callbacks you've gotten , when reaches messages.length, know you're done:
var completed = 0; (var = 0; < messages.length; i++) { var message = messages[i]; console.log('- %s', message.id); var request = gmail.users.messages.get({ auth: auth, id: message.id, userid: 'me' }, function(err, response) { if (err) { // should increment , check `completed` here too, // not sure want though console.log('api returned error: ' + err); return; } res.write(json.stringify(response, null, '\t')); if (++completed == messages.length) { res.end(); } }); }
that assumes nothing change messages
in meantime (affecting length). if assumption isn't valid, can invert completed
, call pending
, , you're done when reaches 0
:
var pending = 0; (var = 0; < messages.length; i++) { var message = messages[i]; console.log('- %s', message.id); var request = gmail.users.messages.get({ auth: auth, id: message.id, userid: 'me' }, function(err, response) { if (err) { // should decrement , check `pending` here too, // not sure want though console.log('api returned error: ' + err); return; } res.write(json.stringify(response, null, '\t')); if (--pending === 0) { res.end(); } }); ++pending; }
Comments
Post a Comment