【问题标题】:Using Promises with boolean return values使用带有布尔返回值的 Promise
【发布时间】:2017-08-05 22:59:15
【问题描述】:

我对@9​​87654321@ 的最佳实现感兴趣,它旨在提供布尔结果。我的问题考虑了 Promises / Futures 的任何实现,其中包括 then 的逻辑等价物,如 Promises/A+。 我的问题是:这样的 Promise resolve 是否应该带有布尔值,无论结果如何,还是应该在 truetrue 上使用 resolve 和在 false 上使用 reject

因此在 Javascript 中就像在 ES6 中一样:

class Named {
    constructor(name) {
        this.name = name;
    }
    // always resolve
    isFoo1() {
        return new Promise(resolve => {
        resolve(this.name === 'Foo');
        });
    }
    // resolve or reject
    isFoo2() {
        return new Promise((resolve, reject) => {
            if (this.name === 'Foo') {
                return resolve(true);
            }
            reject(new Error('Not Foo!'));
        });
    }
}

现在你可以这样做了:

const namedObjects = [new Named('Foo'), new Named('FooBar'), new Named('Foo')];
const nameChecks = namedObjects.map(obj => obj.isFoo1());
const checkNames = () => namedObjects.map(obj => obj.isFoo2());

// using always resolve
Promise.all(nameChecks)
    .then(results => {
        if(results.every(v => v)) {
            return alert('all is foo!');
        }
        alert('all is not foo!');
    });

// using resolve or reject
Promise.all(checkNames())
    .then(() => alert('all is foo!'))
    .catch(() => alert('all is not foo!'));

我认为“解决或拒绝”版本更自然地与 Promise 概念配合使用 - 特别是使用 Bluebird 中的扩展实现。

【问题讨论】:

  • 您可以使用任何适合应用程序的东西来解决 Promise。对象、数字、字符串等等。
  • 请注意,两个版本都使用 bool 解析 - 问题不在于使用什么解析。但是是否映射 bool 来解决 and 拒绝或 bool。
  • 对不起,这个问题仍然没有任何意义。

标签: javascript promise future boolean-logic


【解决方案1】:

您不想将 Promise 的分辨率值与其状态混为一谈。例如,假设 XHR 查询结果为 false。这是否意味着存在拒绝,或者您查询的值实际上是false

【讨论】:

  • 所以您是说当且仅当出现错误时才拒绝(在这种情况下是在尝试访问名称时)?因此争论版本1?
  • @BM,是的,您应该对错误使用拒绝。尽管有些人将特殊情况视为错误(例如未找到错误)。我的观点只是对 Promise 实现的一般观察,而不是 Promise 用例。 Promise 不应该仅仅依赖于它们的执行处理程序来处理拒绝和执行状态。他们应该通过各自的方式来处理状态,从而兼顾两者。
  • 如果您的意思是“您应该对错误使用拒绝”并且仅错误,那么您对我的理解的观察将对 Promise 用例产生影响。具体来说,应该使用isFoo1
猜你喜欢
  • 1970-01-01
  • 2013-04-09
  • 2012-09-19
  • 2019-08-19
  • 2021-10-21
  • 2013-08-18
  • 2021-02-20
  • 2018-01-24
  • 2011-12-14
相关资源
最近更新 更多