Javascript 以承诺为条件

Javascript 以承诺为条件,javascript,node.js,promise,Javascript,Node.js,Promise,我知道,下面的代码就是基于它编写的。这是工作,但我不满意的东西 如果我想进行一些条件检查并基于它进行解析,该怎么办?我已经评论了我想更改的代码 /** * Returns not yet propagate subdomains. * @return Promise */ Tour.prototype.getOffline = function() { var self = this; var resolve_, reject_; // to be fulfilled late

我知道,下面的代码就是基于它编写的。这是工作,但我不满意的东西

如果我想进行一些条件检查并基于它进行解析,该怎么办?我已经评论了我想更改的代码

/**
 * 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;
};

基本上,您需要一个函数,该函数接受一个承诺并返回一个承诺,该承诺在另一个承诺解析(满足或拒绝)时满足:

该函数通常称为“反射”:

这意味着您可以拒绝(像通常一样),然后执行以下操作:

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
});

所以,当所有的承诺都达成时,你想基本上采取行动,不管承诺是否兑现或解决?(如果没有,请包括你想做的事情,你的目标是什么?)我想我没有理解你的问题。避免!这个
(x=>({state:“completed”,value:x})
是如何用javascript编写的?谢谢你的回答。@JonatasWalker-uhh…那是javascript。它运行在我假设你正在使用的节点上-它是短(箭头)函数语法。你可以用
函数(x){return state:completed,value:x}替换它
在这种情况下,它应该可以工作。
function reflect(promise){
    return promise.then(x => ({state: "fulfilled", value: x}),
                        e => ({state: "rejected" , value: e}));
}
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
});