javascript - 是否需要将函数声明为异步函数才能返回 promise ?

标签 javascript promise async-await synchronous

我正在使用一个辅助函数 (fetchGet) 来返回一个返回 promise 的异步函数 (fetchWrapper)。 这个辅助函数是否需要声明为异步的,它本身会返回一个 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 函数声明为异步函数,以便它返回 promise ?

或者我可以像下面那样将它声明为一个普通的同步函数吗? (对于 getSpecificData 函数来说确实是相同的情况)

function fetchGet(url) {
  return fetchWrapper(url, 'GET');
}

最佳答案

Does a function need to be declared as asynchronous to return a promise?

不,一点也不。事实上,promises 早在 async 函数出现之前就已经存在了。

你的包装器可以是:

function fetchGet(url) {
  return fetchWrapper(url, 'GET');
}

如果您没有在函数内使用 await,则不需要 async。您可以选择拥有它以标记函数的异步性质,例如,作为代码内文档(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;
}

关于javascript - 是否需要将函数声明为异步函数才能返回 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56253824/

相关文章:

javascript - 异步函数 promise 何时解决?

javascript - 在非异步函数中使用 "await"

javascript - AngularJS - 带有 Angular UI Bootstrap 的指令

javascript - Ava 使用 Promise : promise returned by test never resolved 测试图像加载

javascript - 外部 js 文件中的 Symfony 2 翻译

javascript - 如何用 Nightwatch 履行 promise

javascript - 可观察为嵌套在 Promise 中的 Promise

javascript - 单个值的 Observable 与 Promise

javascript - 来自引号 javascript 中输入的值

c# - 带有 yield 返回的异步任务<IEnumerable>?