多次asynchronous调用后callback?

我正在使用Gmail API检索循环中的邮件,并为每条邮件执行req.write()。 每个api调用都有一个callback函数,但是如何知道整个集合是什么时候完成的,以便我可以结束响应? 我尝试了以下,但注意到,callback没有按照数组索引的顺序执行,所以我不能只是做我注释的线。

for (var i = 0; i < 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 an error: ' +err); return; } res.write(JSON.stringify(response,null,'\t')); console.log(e); //if(e==messages.length-1) res.end(); } ); })(i); } 

尽pipe如此,你仍然走在正确的道路上。 由于在循环完成之前您不会得到任何callback,因此您可以跟踪您获得的callback数量以及何时到达messages.length,您知道已经完成:

 var completed = 0; for (var i = 0; i < 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 and check `completed` here too, // not sure what you want to do though console.log('API returned an error: ' + err); return; } res.write(JSON.stringify(response, null, '\t')); if (++completed == messages.length) { res.end(); } }); } 

假设在此期间没有任何信息会改变(影响其长度)。 如果这个假设是无效的,你可以反转completed ,调用它pending ,当它达到0时就完成了:

 var pending = 0; for (var i = 0; i < 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 and check `pending` here too, // not sure what you want to do though console.log('API returned an error: ' + err); return; } res.write(JSON.stringify(response, null, '\t')); if (--pending === 0) { res.end(); } }); ++pending; }