在`async/await`链中,所有的函数都必须使用`async/await`关键字吗?

4
async/await 链中,所有的功能都需要使用 async/await 关键字吗?
async function one() {
  return await fetch(.....);
}

async function two() {
  return await one();
}

async function three() {
  return await two();
}

我曾在教程中看到一些例子,其中调用者不必使用关键字。

2
只有在您依赖返回值的情况下才需要异步执行。整个过程都必须是异步的。如果您不关心依赖函数是否完成,则无需使用“await”。此外,您也无需使用“await fetch”,只需使用“fetch”即可。 - zero298
1
实际上,你的问题是“在返回之前是否需要等待”,还是“我总是需要等待所有东西吗?”我无法确定。 - zero298
回答OP的问题:不,你的函数可以直接返回一个Promise而不需要是async。它仍然可以被等待。Async基本上将您的函数包装成Promise(或多或少,这并不精确),而await在async上下文中取消包装该Promise。因此,在您期望异步函数的任何地方,您都可以传递Promise。 - netchkin
1
不,一个函数不需要是 async 就可以被 await。它只需要返回一个 Promise。 - Bergi
@Bergi - await 可以应用于原始值,类似于 Promise.all 接受其参数数组的原始值。虽然不一定有用,但您可以等待函数调用而不知道它是否返回一个 promise。 - traktor
显示剩余2条评论
1个回答

6
不需要,至少对于这个例子不需要 - 如果你有一个函数只是 await 一个 Promise 并且 return 结果,你可以只返回该 Promise,而不需要使用任何 asyncawait
function one() {
  return fetch(.....);
}

function two() {
  return one();
}

function three() {
  return two();
}

如果您想要一个平坦的函数体,当该函数使用await并需要在返回另一个已解析的Promise之前执行其他操作时,您需要使用它来处理一个消费Promise。例如:

async function one() {
  const fetchResult = await fetch(.....);
  // do something with fetchResult
  return foo;
}

function two() {
  return one();
}

function three() {
  return two();
}

在这里,one正在等待fetch调用,并在返回Promise之前对其进行处理,但twothree不需要是async,因为它们只是调用返回Promise的函数并将该Promise返回给调用者。如果twothree在等待之后但在解决之前也必须执行某些操作,则它们将不得不使用await(如果您想要一个平面化的函数体):
async function one() {
  const fetchResult = await fetch(.....);
  // do something with fetchResult
  return foo;
}

async function two() {
  const oneResult = await one();
  console.log('got result for one');
  return oneResult;
}

function three() {
  return two();
}

如果one使用fetch结果执行某些操作并返回一个值(不是promise,比如一些JSON数据),那么在调用它时,two是否必须使用await - GN.
如果two需要执行除立即返回之外的其他操作,那么是的 - 这是因为所有async函数都会返回Promise。因此,如果您在一个函数中,为了消耗Promise,获取其中的JSON并将其解析为对象,您必须等待调用async函数。 - CertainPerformance
1
几乎所有的函数在返回Promise之前都会对其进行操作,因此就您最初的问题而言,在这种情况下,大多数异步链中的所有内容都将等待下一个"async"函数的Promise。 - CertainPerformance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接