是否需要将函数声明为与 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)