从 Async/Await 函数返回一些东西有什么意义?

What's the point of returning something from an Async/Await Function?

我在这里创建了一个代码片段,它使用 REST 国家 API 获取关于某个国家的数据。该函数运行良好,并且 returns 一个未决的承诺。该承诺的实现值将等于一个包含国家首都、名称和代码键值对的对象。

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

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'));

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

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

这不是关于它是异步的,相同的原则适用于同步代码。如果您可以让代码专注于单个任务,而不会将其与其他代码片段的需求纠缠在一起,那么您的代码将变得更易于维护。