声明为异步的方法的正确语法是什么?

Gur*_*pof 5 javascript async-await es6-class

在重写过程中我偶然发现了以下ES6方法:

async getUsers(res) {
  User.findAll().then(users => res.json(users));
}
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎有点儿麻烦.我原以为是:

async getUsers(res) {
  return User.findAll().then(users => res.json(users));
}
Run Code Online (Sandbox Code Playgroud)

但是,我知道async有许多技巧,比如自动包装承诺,我的直觉也是正确的吗?

jfr*_*d00 2

return只要调用者不需要访问异步检索的值,编写的代码(不带)就可能没问题。

首先,仅当您计划在函数内部async使用时,才需要将其作为函数定义的一部分。await如果您没有使用awaitinside (您的代码没有显示),则async不需要定义的部分。所以,它可能只是这样:

getUsers(res) {
  User.findAll().then(users => res.json(users));
}   
Run Code Online (Sandbox Code Playgroud)

其次,如果调用者想要使用awaitgetUsers()函数,那么它需要返回一个承诺(如您所提议的)。如果调用者不会使用await它或以其他方式需要访问返回值,则return没有必要。所以,如果你想使用await这个函数,那么它可能应该是这样的:

getUsers(res) {
  // return promise so caller can get async value
  return User.findAll().then(users => {
      res.json(users);
      return users;      // return value so caller can get access to the value
  });
}
Run Code Online (Sandbox Code Playgroud)

因此,只要调用者从不期望该函数的异步返回值,原始代码就可以了(这在这里是可能的,因为异步操作的结果正在发送,res.json()并且这可能是唯一需要的结果)就等待/异步而言,您只需从计划使用等待的函数返回一个承诺。


回顾一下:

  1. asyncawait仅当您计划在函数内部使用时才需要。您的函数可能根本不需要关键字async
  2. 仅当调用者希望能够通过传统f().then()或 via访问异步响应时,才需要返回的 Promise let x = await f()
  3. 调用者可以调用await未标记为 的函数async。将从await函数中获取返回值,如果返回值不是一个 Promise,它将把它包装在一个已解析的 Promise 中。如果它是一个承诺,它将等待它解决。

仅供参考,这是对 async/await以及它们如何与 Promise 交互的非常好的、简短而精彩的回顾。