0

Basically I would like something like this (not work now definitely). Can I use events to make the res.send() happen after all client.get() finished?

var events = require('events');
var eventEmitter = new events.EventEmitter();

var response = {};
var ids = [...];

for (id in ids) {
  this.client.get(id1, function(err, obj) {
    if (!err) {
      response[id.toString()] = obj;
    }
  });
}

res.send({
  response
});
Thomas Wang
  • 2,031
  • 3
  • 17
  • 28

1 Answers1

5

Use Promise.all, The Promise.all(iterable) method returns a promise that resolves when all of the promises in the iterable argument have resolved, or rejects with the reason of the first passed promise that rejects.

var events = require('events');
var eventEmitter = new events.EventEmitter();

var response = {};
var ids = [...];
var promiseArr = [];
for (id in ids) {
  var prom = new Promise(function(resolve, reject) {
    this.client.get(id1, function(err, obj) {
      if (!err) {
        response[id.toString()] = obj;
        resolve();
      }
    });
  })
  promiseArr.push(prom);
}
Promise.all(promiseArr).then(function() {
  res.send({
    response: response
  });
})

Note: As commented by timster, Consider browser support while using Promise object, Polyfill will help!

Community
  • 1
  • 1
Rayon
  • 36,219
  • 4
  • 49
  • 76