【问题标题】:js: stop calling next function if previous one failedjs:如果前一个函数失败,则停止调用下一个函数
【发布时间】:2020-08-18 03:55:09
【问题描述】:

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

function func1() {}
function func2() {}
function func3() {}

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

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

【问题讨论】:

  • func1() && func2() && func3()

标签: javascript refactoring flow-control


【解决方案1】:

正如 shrys 所说,如果您期待真实的值,您可以使用 && 进行链接:

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

如果你有很多论点,单行样式会太乱:

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

这些在函数内部的位置,因此您可以使用return 进行突破。

【讨论】:

    【解决方案2】:

    如果您想按原样使用现有功能,那么 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2013-06-14
      相关资源
      最近更新 更多