【发布时间】: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