【问题标题】:What's the point of returning something from an Async/Await Function?从 Async/Await 函数返回一些东西有什么意义?
【发布时间】:2021-08-06 05:55:48
【问题描述】:

我在这里创建了一个代码 sn-p,它使用 REST 国家 API 获取有关某个国家/地区的数据。该函数工作正常,并返回一个未决的承诺。该承诺的已实现值将等于一个包含国家首都、名称和代码的键值对的对象。

但如果我想将它们用于某事,我为什么不将同一个对象设置为等于一个变量并继续在我的异步函数中编写新操作?为什么还要尝试使用在全局范围内异步获得的值?

function getJSON(url, errorMSG = 'Something went wrong') {
  // feed it the fetch URL, then your customized error message
  return fetch(url).then(response => {
    if (!response.ok) throw new Error(errorMSG);
    return response.json();
  });
}

async function countryData(nation) {
  try {
    const info = await getJSON(
      `https://restcountries.eu/rest/v2/name/${nation}?fullText=true`,
      'Invalid country selected'
    );
    return {
      // Fullfilled value of promise
      capital: info[0].capital,
      name: info[0].name,
      code: info[0].cioc,
    };
  } catch (err) {
    console.error(err); // display your custom error message
  }
}
console.log(countryData('Canada'));

【问题讨论】:

  • “但是,如果我想将它们用于某事,我为什么不直接将同一个对象设置为一个变量并继续在我的异步函数中编写新的操作?” 关注点分离?负责获取数据的代码不应该关心如何处理数据。如果是这样,那么您将不得不为所有内容重写数据获取,并最终导致大量代码重复。
  • “为什么我不只是 [...] 在我的异步函数中继续 [...]?” 因为这在大型应用程序中会很混乱,所以让更难维护,并降低您在多个地方重用相同功能的能力。如果你没有看到重点,说明你的应用程序非常小,在这种情况下,只要做让你感觉更舒服的事情
  • 模块化——这个函数应该只有一个目标,那就是安全地检索数据。超出此范围的任何内容都超出了其预期目的范围。随着您开发更复杂的应用程序,您将很快意识到为什么遵循这一理念如此重要。

标签: javascript ajax asynchronous async-await fetch-api


【解决方案1】:

fetch 是一个异步函数。为什么他们将承诺解析为响应对象,而不是在拥有它后继续运行额外的操作?因为他们不知道你想用它做什么。 fetch 不可能处理接下来应该发生的所有可能的事情,所以它只有一个工作:获取数据,然后返回它(在一个承诺中)。然后,您可以将其与您喜欢的任何其他代码结合使用。

在较小的范围内,countryData 也可能发生这种情况。您的应用程序中可能有 10 个不同的部分想要处理来自countryData 的结果。 countryData 实现所有 10 件事可能并非“不可能”,但这绝对是不切实际的,也不是一个好主意。相反,countryData 可以写成有一项工作:获取国家数据并返回。然后这 10 段代码中的每一个都可以对结果做自己的事情。

这不是关于它是异步的,同样的原则也适用于同步代码。如果您可以将代码集中在一个任务上,而无需将其与其他代码段的需求纠缠在一起,那么您的代码将变得更易于维护。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2019-03-01
    • 2016-09-12
    • 1970-01-01
    相关资源
    最近更新 更多