我正在使用Gmail API循环检索邮件,并对每封邮件执行req.write()。每个api调用都有一个回调,但是如何知道整个设置何时完成,以便结束响应?我尝试了以下操作,但注意到回调未按数组索引的顺序执行,所以我不能只做注释掉的那一行。
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);
}
不过,您走在正确的轨道上。由于在循环完成之前将不会获得任何回调,因此您只需跟踪已获得多少个回调以及何时到达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();
}
});
}
假设messages
在此期间没有任何变化(影响其长度)。如果该假设无效,则可以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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句