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

How to avoid repeated code in promise chain?

我有一个承诺链:

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

我需要这样做,因为我想在发现错误后立即停止其余的异步调用,以便应用程序可以节省一些内存和时间。但是看起来真的很凌乱和多余。

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

谢谢!

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

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

或者你可以包装你的 promise returning 函数:

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

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