为了避免在每个 `async/await` 函数中重复编写 `try/catch` 块,可以采用以下方法

44 阅读2分钟
  1. 高阶函数封装:创建一个高阶函数,接受 async/await 函数作为参数,并在其中实现统一的错误处理逻辑。通过将异步函数封装在高阶函数中,可以避免在每个 async/await 函数中重复编写错误处理代码。

  2. 异步操作包装器:创建一个异步操作的包装器函数,接受 async/await 函数作为参数,并在其中进行异常处理。该包装器函数可在每个异步函数的调用处使用,以提供统一的错误处理机制。

现在,我将为每个方法提供一个简单的示例。

  1. 高阶函数封装的示例:
function withErrorHandling(asyncFn) {
  return async function () {
    try {
      return await asyncFn.apply(this, arguments);
    } catch (error) {
      console.error(error);
      // 其他异常处理逻辑
      throw error;
    }
  };
}

const myAsyncFunction = withErrorHandling(async () => {
  // 异步操作
});

myAsyncFunction();
  1. 异步操作包装器的示例:
async function asyncWrapper(asyncFn) {
  try {
    return await asyncFn();
  } catch (error) {
    console.error(error);
    // 其他异常处理逻辑
    throw error;
  }
}

asyncWrapper(async () => {
  // 异步操作
});

我将为你展示如何在 JavaScript 环境中模拟这二种方式,并提供相应的测试代码示例。

  1. 高阶函数封装的示例测试:
function withErrorHandling(asyncFn) {
  return async function () {
    try {
      return await asyncFn.apply(this, arguments);
    } catch (error) {
      console.error(error);
      // 其他异常处理逻辑
      throw error;
    }
  };
}

async function simulateAsyncOperation() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      reject(new Error("Async operation failed!"));
    }, 2000);
  });
}

const myAsyncFunction = withErrorHandling(async () => {
  await simulateAsyncOperation();
});

myAsyncFunction();

在上述代码示例中,我们定义了 withErrorHandling 函数,并使用它封装了一个模拟的异步操作。myAsyncFunction 是经过封装的异步函数,它在内部进行了错误处理。

  1. 异步操作包装器的示例测试:
async function asyncWrapper(asyncFn) {
  try {
    return await asyncFn();
  } catch (error) {
    console.error(error);
    // 其他异常处理逻辑
    throw error;
  }
}

async function simulateAsyncOperation() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      reject(new Error("Async operation failed!"));
    }, 2000);
  });
}

asyncWrapper(async () => {
  await simulateAsyncOperation();
});

在上述代码示例中,我们使用 asyncWrapper 函数包装了一个模拟的异步操作。在包装器函数内部,我们进行了错误处理。

以上示例展示了二种不同的方法来避免在每个 async/await 函数中重复编写 try/catch 块。你可以根据项目需求选择适合的方法,并根据需要进行自定义和调整。这些方法都有助于提高代码的可读性、可维护性和错误处理的一致性。