我正在使用一个辅助函数(fetchGet
)返回一个异步函数,该异步函数返回一个promise(fetchWrapper
)。
是否需要将该帮助程序函数声明为异步的,以使其自身返回承诺?
我这里的情况是使用提取,这需要在我的第一个函数fetchWrapper
中进行等待(为便于阅读,此处已简化):
// returns a promise
async function fetchWrapper(url, method) {
const response = await fetch(url, {method: method});
if (!response.ok) {
throw new Error("HTTP error " + response.status);
}
return response;
}
async function fetchGet(url) {
return fetchWrapper(url, 'GET');
}
async function getSpecificData() {
return fetchGet('/a/specific/url');
}
我是否需要将fetchGet
函数声明为上述异步函数,以使其返回承诺?
还是我可以将其声明为如下所示的普通同步函数?
(对于getSpecificData
函数,情况确实如此)
function fetchGet(url) {
return fetchWrapper(url, 'GET');
}
答案 0 :(得分:4)
是否需要将函数声明为异步函数以返回承诺?
不,一点也不。实际上,诺言早于async
函数。
您的包装器可以只是:
function fetchGet(url) {
return fetchWrapper(url, 'GET');
}
如果您未在函数内使用async
,则不需要await
。您可能会选择以拥有该标志,以标记该函数的异步特性,例如,作为代码内文档(IDE中的代码提示等)。但这不是必需的。
旁注:fetchWrapper
有问题。如果发生HTTP错误,它会成功并带有实现值undefined
。这意味着使用它的代码必须在使用之前检查实现值以查看它是否为undefined
。我建议将HTTP错误设置为错误(拒绝):
async function fetchWrapper(url, method) {
const response = await fetch(url, {method: method});
if (!response.ok) {
throw new Error("HTTP error " + response.status);
}
return response;
}
答案 1 :(得分:1)
此帮助程序功能是否需要声明为异步才能返回承诺?
否。
async
函数始终返回promise,即使return
语句返回的不是promise。 async
函数可让您使用await
您可以显式地从任何函数返回诺言。
答案 2 :(得分:1)
当您要等待结果的函数内部时,只需要将一个函数声明为async
,所以两者都可以:
// returns a Promise because it's async (resolved with 'value')
async function fetchGet(url) {
const value = await fetchWrapper(url, 'GET');
return value;
}
// returns a Promise because fetchWrapper is a Promise
function fetchGet(url) {
return fetchWrapper(url, 'GET');
}
// returns a Promise, just because it's async
async function fetchGet(url) {
// nothing
}
// returns undefined
function fetchGet(url) {
// nothing
}
这些呼叫者的工作原理完全相同:
fetchGet('url').then(value => {...})
const value = await fetchGet(url)