I have a node express/ socket application where my express server makes several API calls with node-rest-client looping through elements in var jobs and when each finishes, it s
If your jobs
array gets larger, then you may just have too many requests in flight at the same time. It could be:
I'd suggest the following solution to handle all those issues:
const Promise = require('bluebird');
const utils = require('utils');
client.getAsync = utils.promisify(client.get);
function runJobs() {
var jobs = ['J1', 'J2', 'J3', 'J4'];
var full_data = {};
Promise.map(jobs, function(job) {
return client.getAsync("MY URL").then(data => {
io.emit('progressbar', data);
}).catch(err => {
console.log('something went wrong on the request', err.request.options);
// eat the error on purpose to keep going
});
}, {concurrency: 5}).then(() => {
// All done, process all final data here
// Then, schedule the next iteration
setTimeout(runJobs, 5000);
});
}
runJobs();
This runs a max of 5 requests at a time (you can play with adjusting that number) which solves both items 1 and 2 above. And, instead of setInterval()
, it uses a recurring setTimeout()
so that it won't ever schedule the next iteration until the prior one is done (even if the target server gets really slow).