Javascript 函数是否需要声明为异步才能返回承诺?

Javascript 函数是否需要声明为异步才能返回承诺?,javascript,promise,async-await,synchronous,Javascript,Promise,Async Await,Synchronous,我正在使用一个helper函数(fetchGet)返回一个异步函数,该函数返回一个承诺(fetchWrapper)。 这个助手函数是否需要声明为异步以返回承诺 我在这里的例子是使用fetch,这需要在我的第一个函数fetchWrapper中等待(为了便于阅读,这里进行了简化): 我是否需要像上面那样将fetchGet函数声明为异步函数,以便它返回承诺 或者我可以把它声明为一个普通的同步函数,如下所示? (对于getSpecificData函数来说,情况确实相同) 这个助手函数是否需要声明为异步以

我正在使用一个helper函数(
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的code
fetchGet
将是异步的,但您必须遵循其中的函数调用才能看到这一点。毫无疑问,有一些自动化工具可以为您提取签名,因此您甚至不需要自己查找代码,这意味着更容易看到哪个是哪个。@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)