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

Javascript `async/await`链中的所有函数都必须使用`async/await`关键字吗?,javascript,async-await,Javascript,Async Await,async/await链中的所有函数都必须使用async/await关键字吗 async function one() { return await fetch(.....); } async function two() { return await one(); } async function three() { return await two(); } 我在教程中看到了一些示例,其中调用者不必使用关键字 不,至少在本例中不是这样-如果您有一个函数只是wait等待一个承

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

async function one() {
  return await fetch(.....);
}

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

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

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

不,至少在本例中不是这样-如果您有一个函数只是
wait
等待一个承诺并
返回
等待结果,那么您可以只返回该承诺,而不使用任何
async
wait

function one() {
  return fetch(.....);
}

function two() {
  return one();
}

function three() {
  return two();
}
如果您希望有一个扁平的函数体,那么当该函数使用承诺并且需要在将另一个已解析的承诺返回给调用方之前执行其他操作时,您需要使用
wait
。例如:

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

function two() {
  return one();
}

function three() {
  return two();
}
这里,
one
wait
等待
fetch
调用,然后在返回承诺之前对其进行处理,但是
two
two
不需要是
async
,因为它们只是调用一个返回承诺并将该承诺返回给调用方的函数。如果
two
two
在等待后但在解析前也必须执行某些操作,则他们必须使用
wait
(如果您想要一个扁平的函数体):


仅当您依赖于返回的值时。异步执行必须始终是海龟式的。如果您不关心依赖函数是否已完成,则不必等待它。此外,您不必执行
返回等待获取
,只需执行
返回获取
。实际上,您的问题是“我是否需要
在返回前等待
”,还是“我是否总是需要
等待
一切?”。不,你的函数可以直接返回一个承诺,而不需要异步。它仍在等待。Async基本上将您的函数包装成promise(或多或少,这并不精确),而await在异步上下文中打开该promise。因此,无论您在哪里期望异步函数,您都可以传递承诺。不,函数不需要是
async
就可以是
wait
了。它只需要返回一个承诺。如果
one
对获取结果做了一些操作,并返回了一个值(不是承诺,比如说一些JSON),那么
two
在调用它时是否必须使用
wait
呢?如果
two
需要做一些事情而不是立即返回它,然后是-这是因为所有
async
函数都返回承诺。因此,如果你在一个函数中,为了使用承诺,从中提取JSON,并将JSON解析为一个对象,你必须等待
异步
函数的调用。几乎所有函数都会在返回承诺之前使用承诺做些事情,所以关于你最初的问题,大多数情况下,在这种情况下,异步链中的所有内容都将等待下一个
async
函数的承诺。
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();
}