使用带有布尔返回值的Promises

时间:2017-08-05 14:51:55

标签: javascript promise future boolean-logic

我感兴趣的是Promise的最佳实现,它意味着给出一个布尔结果。我的问题考虑了承诺/期货的任何实施,包括与Promises/A+中的then逻辑等效。 我的问题是:这样的Promise resolve是否应该使用布尔值,无论结果如何,resolvetrue reject上的false应该是什么?

因此在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中的扩展实现。

1 个答案:

答案 0 :(得分:0)

您不希望将承诺的解决价值与其状态混为一谈。例如,假设XHR查询结果为false。这是否意味着拒绝,或者您查询的值实际上是false