Javascript 重构 - 从异步函数结果或回退值中解构数据

Javascript Refactoring - Destructuring data from async function result or fallback value

我有一个可能会失败的异步函数:

const f = () => new Promise((_, reject) => reject("Ups"));

和一个 FALLBACK 值常量:

const FALLBACK = { name: "Raul" };

我正在尝试从 f() 方法响应数据中解构 name 字段,(因为,如果它没有失败,return 将是一个包含该字段的对象),以防万一它失败了,我使用回退值。

我正在做以下事情:

function f() {
  return new Promise((_, r) => r("Ups"));
}

const FALLBACK = { name: "Raul" };

(async () => {
  const { name } = (await f().catch(() => {})) ?? FALLBACK; // I need to refactor this line

  console.log(name);
})();

如何重构此代码?

看来你只是想要await f().catch(() => FALLBACK)。如果 f() 拒绝,则您将用 FALLBACK 对象替换结果

这是一个工作示例:

function f() {
  return new Promise((_, r) => r("Ups"));
}
const FALLBACK = { name: "Raul" };

(async () => {
  const { name } = await f().catch(() => FALLBACK); 

  console.log(name);
})();

有些人不喜欢 .catch()await 的混合,建议使用 try/catch 而不是 .catch()。两者都行——这是一种风格偏好。在这种特殊情况下,我发现 .catch() 看起来更简单 - 但请遵循您自己的喜好。

另外,请注意我从 f() 定义中删除了 async。由于您没有使用 async 函数的任何功能,因此没有必要也没有用。

并且请注意,有时甚至不记录错误就盲目 .catch() 所有可能的错误是很危险的。像上游输入错误这样简单的事情可能会导致 .catch() 触发,你会很困惑为什么你的代码突然做它正在做的事情(因为你正在默默地吃掉一个你可能不打算吃的错误你至少应该记录日志)。