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

时间:2019-05-22 09:41:14

标签: javascript promise async-await synchronous

我正在使用一个辅助函数(fetchGet)返回一个异步函数,该异步函数返回一个promise(fetchWrapper)。 是否需要将该帮助程序函数声明为异步的,以使其自身返回承诺?

我这里的情况是使用提取,这需要在我的第一个函数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函数声明为上述异步函数,以使其返回承诺?

还是我可以将其声明为如下所示的普通同步函数? (对于getSpecificData函数,情况确实如此)

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

3 个答案:

答案 0 :(得分:4)

  

是否需要将函数声明为异步函数以返回承诺?

不,一点也不。实际上,诺言早于async函数。

您的包装器可以只是:

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

如果您未在函数内使用async,则不需要await。您可能会选择以拥有该标志,以标记该函数的异步特性,例如,作为代码内文档(IDE中的代码提示等)。但这不是必需的。


旁注:fetchWrapper有问题。如果发生HTTP错误,它会成功并带有实现值undefined。这意味着使用它的代码必须在使用之前检查实现值以查看它是否为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;
}

答案 1 :(得分:1)

  

此帮助程序功能是否需要声明为异步才能返回承诺?

否。

async函数始终返回promise,即使return语句返回的不是promise。 async函数可让您使用await

管理其中的其他承诺

您可以显式地从任何函数返回诺言。

答案 2 :(得分:1)

当您要等待结果的函数内部时,只需要将一个函数声明为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)