如何避免承诺链中的重复代码?

时间:2017-11-08 22:31:28

标签: promise coding-style code-cleanup

我有一个承诺链:

Promise
.then(function() {
    if (some condition) {
        Promise.reject("Request cancelled");
    }

    return doSomething1();
})
.then(function() {
    if (some condition) {
        Promise.reject("Request cancelled");
    }

    return doSomething2();
})
.then(function() {
    if (some condition) {
        Promise.reject("Request cancelled");
    }

    return doSomething3();
})
.catch(function(err) {
    if (err == "Request cancelled") {
        // err handling here
    }
})

在每个.then()中,都有相同的代码检查是否要破坏承诺链:

// repeated code
if (some condition) {
    Promise.reject("Request cancelled");
}

我需要这样做,因为我想在捕获错误后立即停止其余的异步调用,以便应用程序可以节省一些内存和时间。但它看起来非常混乱和冗余。

所以我的问题是:有没有办法编写这段代码并避免重复代码?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您不打算将此逻辑构建到doSomething1()doSomething2()中,以便在条件满足时它们自己返回被拒绝的承诺,那么我能想到的最简单的事情就是改变这样:

p.then(function() {
    if (some condition) {
        Promise.reject("Request cancelled");
    }

    return doSomething1();
}).then(function() {
    if (some condition) {
        Promise.reject("Request cancelled");
    }

    return doSomething2();
}).then(...).catch(...);

这样的事情:

p.then(checkCondition).then(function() {
    return doSomething1().then(checkCondition);
}).then(function() {
    return doSomething2().then(checkCondition);
}).then(...).catch(...);

在哪里,您可以定义checkCondition()以包含您的共享条件:

function checkCondition(val)
    if (some condition) {
        return Promise.reject("Request cancelled");
    }
    return val;
}

或者你可以包裹你的承诺返回函数:

p.then(checkCondition).then(function() {
    return checkCondition(doSomething1());
}).then(function() {
    return checkCondition(doSomething2());
}).then(...).catch(...);

checkCondition()是这样的:

function checkCondition(p) {
    return p.then(function(val) {
        if (some condition) {
            return Promise.reject("Request cancelled");
        }
        return val;
    });
}

如果除了对这些异步函数调用进行排序并检查它们上的特定条件之外什么都没有,那么您可以通过传入一组函数并对数组排序来自动化它,检查每个结果的条件。