中间异步功能是否不必总是用Javascript中的`async`关键字包装?

时间:2019-10-24 09:00:50

标签: javascript asynchronous async-await

在下面的代码示例中,函数a返回一个promise。返回后使用awaituseless,但我认为(并根据examples),返回promise的函数仍应是async函数。但是,即使我没有在async中添加a关键字,但如果在功能await中使用了b,它仍然可以工作。如果我不在a()内等待b,那么bRes是一个承诺对象,而不是5。因此,这意味着我可以有无数个函数,例如a,它们会返回Promise,并且只要调用此无限链await的第一个函数得到结果,那么我就不需要包装async的中间功能?

const getPromise = () => new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('promise finished')
    resolve(5)
  }, 2000)
})

const a = () => {
  console.log('from a')
  return getPromise()
}

const b = async () => {
  const bRes = await a()
  console.log('bRes', bRes)
}

b()

2 个答案:

答案 0 :(得分:2)

  • 您只能在Taxi Driver | Drama Taxi Driver | Criminal 的函数内使用await
  • async的函数将返回诺言
  • 可以使用其他方式(例如async)来创建承诺
  • 您只能(有用)new Promise一个诺言

由于await返回承诺,并且a()b,因此您可以asyncawaita()的返回值。 / p>

答案 1 :(得分:1)

除非在其中使用了async关键字,否则函数无需使用await关键字。

如果在标记为await的函数之外使用async关键字,则该关键字将不起作用。这是async关键字的唯一技术用途(如果您出于文档目的使用它,那很好,但除此之外没有做任何事情)。

所有其他函数,例如同步函数,promise生成器,事件处理程序,观察者处理程序或只是普通的旧回调,都不需要标记async(除非您在其中使用await)。