Javascript 函数是否需要声明为异步才能返回承诺?
我正在使用一个helper函数(Javascript 函数是否需要声明为异步才能返回承诺?,javascript,promise,async-await,synchronous,Javascript,Promise,Async Await,Synchronous,我正在使用一个helper函数(fetchGet)返回一个异步函数,该函数返回一个承诺(fetchWrapper)。 这个助手函数是否需要声明为异步以返回承诺 我在这里的例子是使用fetch,这需要在我的第一个函数fetchWrapper中等待(为了便于阅读,这里进行了简化): 我是否需要像上面那样将fetchGet函数声明为异步函数,以便它返回承诺 或者我可以把它声明为一个普通的同步函数,如下所示? (对于getSpecificData函数来说,情况确实相同) 这个助手函数是否需要声明为异步以
fetchGet
)返回一个异步函数,该函数返回一个承诺(fetchWrapper
)。
这个助手函数是否需要声明为异步以返回承诺
我在这里的例子是使用fetch,这需要在我的第一个函数fetchWrapper
中等待(为了便于阅读,这里进行了简化):
我是否需要像上面那样将fetchGet
函数声明为异步函数,以便它返回承诺
或者我可以把它声明为一个普通的同步函数,如下所示?
(对于getSpecificData
函数来说,情况确实相同)
这个助手函数是否需要声明为异步以返回承诺
没有
async
函数总是返回承诺,即使return
语句返回的内容不是承诺async
函数允许您使用wait
您可以从任何函数显式返回承诺
函数是否需要声明为异步才能返回承诺
不,一点也不。事实上,承诺早在async
函数之前就存在了
您的包装可以是:
function fetchGet(url) {
return fetchWrapper(url, 'GET');
}
如果未在函数中使用wait
,则不需要async
。您可以选择使用它来标记函数的异步性质,例如,在代码文档中(IDE中的代码提示等)。但这不是必需的
旁注:
fetchWrapper
有问题。如果出现HTTP错误,它将成功,并具有未定义的履行值。这意味着使用它的代码在使用它之前必须检查实现值,以查看它是否未定义。我建议您犯HTTP错误(拒绝):
在函数内部等待结果时,只需将函数声明为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)
async
函数会自动返回一个承诺,如果代码中没有返回任何承诺(无论您的代码返回什么,它都会将结果包装为承诺)。“否则,您就不需要它。”使用它的一个主观原因是async
会明确哪个函数是异步的。您只需要查看签名,而不需要检查代码的作用。事实上,使用OP的codefetchGet
将是异步的,但您必须遵循其中的函数调用才能看到这一点。毫无疑问,有一些自动化工具可以为您提取签名,因此您甚至不需要自己查找代码,这意味着更容易看到哪个是哪个。@t.J.Crowder您使用我笨重的fetchWrapper是对的,我过度简化了它。我用你简洁的备选方案编辑
async function fetchWrapper(url, method) {
const response = await fetch(url, {method: method});
if (!response.ok) {
throw new Error("HTTP error " + response.status);
}
return response;
}
// 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)