【问题标题】:Javascript Refactoring - Destructuring data from async function result or fallback valueJavascript 重构 - 从异步函数结果或回退值中解构数据
【发布时间】:2021-12-28 18:32:57
【问题描述】:

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

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

和一个 FALLBACK 值常量:

const FALLBACK = { name: "Raul" };

我正在尝试从 f() 方法响应数据中解构 name 字段,(因为,如果它没有失败,则返回将是一个带有该字段的对象),如果它失败,我使用后备值。

我正在做以下事情:

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

如何重构这段代码?

【问题讨论】:

  • 首先使用 .then .catch 或 async await ,不要混用
  • 我需要重构这一行”如何重构呢?我不确定目标是什么。
  • @RandyCasburn 我认为这只是一个拒绝的异步函数的示例,而不是真正的代码。
  • 你不只是想要await f().catch(() => FALLBACK)。如果f() 拒绝,那么您将替换FALLBACK 对象作为结果。
  • 嘿 Raul - 反模式不必要地将 Promise 对象包装在 Promise 对象中。在您提供的代码中,您从一个标记为异步函数的函数返回一个 Promise 对象 - 根据定义,这会强制该函数返回一个 Promise 对象。因此,正如您所指出的,async 关键字不是必需的 - 一切都已修复。

标签: javascript ecmascript-6 async-await


【解决方案1】:

您似乎只想要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() 触发,你会很困惑为什么你的代码会突然做它正在做的事情(因为你正在默默地吃一个你可能不打算吃的错误,而你至少应该记录日志)。

【讨论】:

  • 是的,对不起 async 关键字,在我的真实代码中,我在返回之前等待了一些东西,只是复制和粘贴。
猜你喜欢
  • 2020-03-17
  • 2014-10-28
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 2018-08-12
  • 2015-03-29
相关资源
最近更新 更多