Condicional en Promise.all

Soy consciente de esta respuesta y el siguiente código se basa en ella. Está funcionando pero no estoy contento con algo.

¿Qué sucede si deseo realizar algunas comprobaciones condicionales y resolverlas en función de ello? He comentado en el código donde me gustaría cambiar.

/** * Returns not yet propagate subdomains. * @return Promise */ Tour.prototype.getOffline = function() { var self = this; var resolve_, reject_; // to be fulfilled later var promise = new Promise(function(resolve, reject){ resolve_ = resolve; reject_ = reject; }); var check = function(key) { return new Promise(function(resolve, reject) { redis_client.hmget(key, 'online', function(err, reply) { if (reply[0] === 'n') { resolve(key); // <----- I'd like to resolve only here } else { // reject(); // <---- I can't reject cause of Promise.all resolve(); // <----- An empty value to satisfy Promise.all } }); }); }; this.getKeysRedis('subdomain:*').then(function(resp) { var promises = resp.map(check); var results = Promise.all(promises); results.then(function(data) { // I have undefined values on data array var array = data.filter(function(key){ return utils.isDefAndNotNull(key); }); resolve_(array); // <------ How can I resolve without filtering }); }, function(error) { reject_(error); }); return promise; }; 

Código final, eliminado Promise constructor antipattern como @Bergi alertó:

 Tour.prototype.getOffline = function() { var self = this; var check = function(key) { return new Promise(function(resolve, reject) { redis_client.hmget(key, 'online', function(err, reply) { if (reply[0] === 'n') resolve(key); else reject(); }); }); }; var reflect = function(promise) { return promise.then( x => ({state: 'resolved', value: x}), e => ({state: 'rejected' , value: e}) ); }; return new Promise(function(resolve, reject) { self.getKeysRedis(self.subdomain_keyname + '*') .then(function(keys) { return Promise.all(keys.map(check).map(reflect)).then(function(r) { return r.filter(x => x.state === 'resolved'); }); }) .then(function(results) { var array = results.map((result) => result.value); resolve(array); }) .catch((err) => reject(err)); }); }; 

Básicamente, desea una función que tome una promesa y devuelva una promesa que se cumpla cada vez que la otra promesa se resuelva (cumpla o rechace):

Esa función se llama típicamente “reflejar”:

 function reflect(promise){ return promise.then(x => ({state: "fulfilled", value: x}), e => ({state: "rejected" , value: e})); } 

Esto significa que puede rechazar (como lo haría normalmente) y luego hacer:

 this.getKeysRedis('subdomain:*').then(resp => resp.map(check).map(reflect); // note the reflect ).then(Promise.all).then(results => { // access results here results[0].state; // "fulfilled" if it fulfilled results[0].value; // the value or error });