如何包装需要异步调用的复杂if-then语句?

时间:2016-02-25 22:43:32

标签: javascript promise bluebird

我是使用bluebird promise库的新手。而且我想知道是否有更好的方法来进行复合,如果然后分支语句可能需要也可能不需要异步调用而不是我现在正在做的。

我现在拥有的例子:

(function() {

    if (a) {
        return ModelA.findById(id);
    } else if (b) {
        return ModelB.findById(id);
    } else if (c) {
        return ModelC.findById(id);
    } else {
        return Promise.reject(new Error('a, b, or c must be specified'));
    }
})()
.then(function(result) {
    if(result == null) {
        return new Error('Object not found')
    }
    result.removedBy = user.id;
    result.removedWhen = new Date();
    result.inactive = true;
    return result.save();
})

1 个答案:

答案 0 :(得分:2)

我唯一要改变的是把它放在$array = array(2) { ["index"]=> string(1) "1" ["routePartitionName"]=> string(20) "US-555-foop-GWRoutes" }

.then

这具有更好的错误处理特性:您不必担心异常和拒绝,并且潜在的编码错误与其他错误的处理方式相同。

Promise.resolve() .then(function() { if (a) return ModelA.findById(id); if (b) return ModelB.findById(id); if (c) return ModelC.findById(id); throw new Error('a, b, or c must be specified'); }) .then(function(result) { if (!result) { return new Error('Object not found'); } result.removedBy = user.id; result.removedWhen = new Date(); result.inactive = true; return result.save(); }) .catch(e => console.error(e)); 内部有一个额外的好处,就是不要担心总是返回一个承诺(因为任何返回的内容会自动包含在一个中),一个不错的不变量,也更具可读性。