当前位置: 首页 > 知识库问答 >
问题:

以promise为条件。全部[副本]

湛骏祥
2023-03-14

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

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

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

最终代码,已删除@Bergi警告的Promise构造函数反模式:

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

共有1个答案

蒋曾笑
2023-03-14

你基本上想要一个函数,它接受一个promise,并返回一个promise,当另一个promise解决(满足或拒绝)时,这个promise就会实现:

该函数通常被称为“反映”:

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
});
 类似资料:
  • 我有一个类似这样的问题:在返回函数的变量之前,我如何等待一个promise完成? 我有一个函数来执行一些表单验证。作为其中的一部分,它有时会打开一个模式,用户必须在返回值之前关闭该模式,如下所示: 注意,直到模式关闭,它才。 但是,我有一个基于函数计算的条件 这样做的问题是,如果将参数传递给,而不需要等待模式,那么我将得到一个未定义的promise。 TypeError:无法读取未定义的属性“th

  • 我看过一些代码,其中人们使用了带有两个“!”的条件子句s 这是我能找到的一些例子。 使用有什么好处超过?

  • 在Flatter引入空安全特性之前,我能够有条件地在列表中添加小部件,如下所示: 是一个自制的过滤器,可以过滤掉空对象... 现在使用空安全性是不可能的,因为小部件列表严格来说必须是非空的。什么是更好的方法?

  • 我试图通过在本书的练习中创建promise.all方法来理解promise是如何工作的:https://eloquentjavascript.net/11_async.html#i_ug+dv9mmsw 我尝试遍历作为方法本身参数给出的整个数组,使用。然后对于成功的promise,处理程序的主体将结果推送到我以前在循环外定义的绑定,对于拒绝的promise,我使用。catch的方式是,它将拒绝的值

  • 首先我想问一下这是不是可能的,设置值为全局变量在异步函数或承诺? 如果是,那么为什么每个可用的教程/网站都在教程中使用console.log(结果),但从来没有使用它将其赋值给variable。 例如:

  • 在条件是promise的情况下,是否可以在循环时生成本机JavaScript