是否需要将函数声明为与 return promise 异步?
Does a function need to be declared as asynchronous to return a promise?
我正在使用一个辅助函数 (fetchGet
) returning 一个 return 承诺的异步函数 (fetchWrapper
)。
是否需要将此辅助函数声明为与其自身异步 return promise?
我这里的情况是使用 fetch,需要在我的第一个函数中等待 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
函数声明为异步函数,以便 return 承诺?
或者我可以像下面那样将它声明为一个普通的同步函数吗?
(对于 getSpecificData
函数来说确实是相同的情况)
function fetchGet(url) {
return fetchWrapper(url, 'GET');
}
Does this helper function need to be declared as asynchronous to itself return a promise?
没有
async
函数总是 return 承诺,即使 return
语句 return 不是承诺。 async
函数让您可以使用 await
管理其中的其他承诺
您可以明确地return任何函数的承诺。
Does a function need to be declared as asynchronous to return a promise?
不,一点也不。事实上,promises 在 async
功能出现之前很久就存在了。
您的包装器可以是:
function fetchGet(url) {
return fetchWrapper(url, 'GET');
}
如果您没有在函数内部使用 await
,则不需要 async
。您可能 选择 以标记函数的异步性质,例如,作为 in-code 文档(IDE 中的代码提示等)。但这不是必需的。
旁注:fetchWrapper
有问题。如果存在 HTTP 错误,它 成功 并且实现值 undefined
。这意味着使用它的代码必须在使用它之前检查 fulfillment 值以查看它是否为 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;
}
你只需要将一个函数声明为 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)
我正在使用一个辅助函数 (fetchGet
) returning 一个 return 承诺的异步函数 (fetchWrapper
)。
是否需要将此辅助函数声明为与其自身异步 return promise?
我这里的情况是使用 fetch,需要在我的第一个函数中等待 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
函数声明为异步函数,以便 return 承诺?
或者我可以像下面那样将它声明为一个普通的同步函数吗?
(对于 getSpecificData
函数来说确实是相同的情况)
function fetchGet(url) {
return fetchWrapper(url, 'GET');
}
Does this helper function need to be declared as asynchronous to itself return a promise?
没有
async
函数总是 return 承诺,即使 return
语句 return 不是承诺。 async
函数让您可以使用 await
您可以明确地return任何函数的承诺。
Does a function need to be declared as asynchronous to return a promise?
不,一点也不。事实上,promises 在 async
功能出现之前很久就存在了。
您的包装器可以是:
function fetchGet(url) {
return fetchWrapper(url, 'GET');
}
如果您没有在函数内部使用 await
,则不需要 async
。您可能 选择 以标记函数的异步性质,例如,作为 in-code 文档(IDE 中的代码提示等)。但这不是必需的。
旁注:fetchWrapper
有问题。如果存在 HTTP 错误,它 成功 并且实现值 undefined
。这意味着使用它的代码必须在使用它之前检查 fulfillment 值以查看它是否为 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;
}
你只需要将一个函数声明为 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)