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

Popular posts from this blog

resizing Telegram inline keyboard -

command line - How can a Python program background itself? -

php - "cURL error 28: Resolving timed out" on Wordpress on Azure App Service on Linux -