js:如果上一个函数失败,则停止调用下一个函数



我有很多函数,每个函数都会返回一个ok状态,我想逐个调用它们,如果上一个函数返回错误的ok状态,则停止调用下一个函数。

function func1() {}
function func2() {}
function func3() {}
const ok1 = func1();
if (ok1) {
const ok2 = func2();
if (ok2) {
func3();
}
}

但在这种代码风格中,我得到了太多嵌套的大括号,我该如何使它更好?

正如shrys提到的,如果您期望真实的值,则可以使用&&进行链:

func1() && func2() && func3() && ...;

如果你有很多论点认为单行样式太乱:

if (!func1(...)) return;
if (!func2(...)) return;
if (!func3(...)) return;

这些都在函数内部,因此可以使用return进行分解。

如果您想按原样使用现有的函数,那么tadman答案中描述的两种技术都很好。然而,有一种更干净的方法来处理这一问题,但它需要您修改现有的函数:只需抛出一个错误。

function func1() {if (fail) throw new Error('Failed')}
function func2() {if (fail) throw new Error('Failed')}
function func3() {if (fail) throw new Error('Failed')}
try {
func1();     // This part becomes much cleaner
func2();
func3();
}
catch (e) {
// Error handling is localized to this block of code
console.log(e.message);
}

理想情况下,对于这种情况,我个人喜欢返回一个自定义错误,这样我就知道它是由我自己的代码引起的,我可以正确地处理它们(大多数情况下只是忽略它们(,然后重新抛出其他错误类型。但你是否这样做取决于你:

class FunctionFailureError extends Error {
constructor(message) {
super(message);
this.code = 'FUNC_FAIL_ERROR';
}
}
function func1() {if (fail) throw new FunctionFailureError('Failed')}
function func2() {if (fail) throw new FunctionFailureError('Failed')}
function func3() {if (fail) throw new FunctionFailureError('Failed')}
try {
func1();
func2();
func3();
}
catch (e) {
if (e.code === 'FUNC_FAIL_ERROR') {
console.log(e.message);
}
else {
throw e;
}
}

最新更新