Javascript 声明为async的方法的正确语法是什么?

Javascript 声明为async的方法的正确语法是什么?,javascript,async-await,es6-class,Javascript,Async Await,Es6 Class,在一次回顾中,我偶然发现了以下ES6方法: async getUsers(res) { User.findAll().then(users => res.json(users)); } 对我来说,这辆车似乎有问题。我本以为会发生以下情况: async getUsers(res) { return User.findAll().then(users => res.json(users)); } 但是,我知道async有很多技巧,比如自动包装承诺,所以我的直觉正确吗?只要调用

在一次回顾中,我偶然发现了以下ES6方法:

async getUsers(res) {
  User.findAll().then(users => res.json(users));
}
对我来说,这辆车似乎有问题。我本以为会发生以下情况:

async getUsers(res) {
  return User.findAll().then(users => res.json(users));
}
但是,我知道async有很多技巧,比如自动包装承诺,所以我的直觉正确吗?

只要调用方不需要访问异步检索的值,编写的代码(没有
返回值)就可以了

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

getUsers(res) {
  User.findAll().then(users => res.json(users));
}   
其次,如果调用方希望在
getUsers()
函数上使用
wait
,那么它需要返回一个承诺(如您所建议的)。如果调用者不使用
wait
,或者需要访问返回值,则不需要
return
。因此,如果您想在此函数上使用
wait
,那么它可能应该是:

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
  });
}
因此,只要调用方不希望从该函数中得到异步返回值,原始代码就可以了(这在这里是可能的,因为异步操作的结果是通过
res.json()发送的)
这可能是唯一需要的结果。就wait/async而言,您只需从计划使用wait的函数返回一个承诺即可


重述:

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

  • 仅供参考,这是一个非常好的、简短而甜蜜的例子,以及它们如何与承诺互动。

    async
    不是ES6,而是ES7什么是
    res
    ?顺便说一句,如果没有任何
    等待
    -你根本不需要
    async
    。@zerkms可能表达了回应object@zerkms事实上,res是一个快速响应对象,用户将是一个sequelize模型(返回承诺)因此:1.应该有
    return
    确实2.你不需要
    async
    非常好的答案。这就是为什么这段代码充满了竞争。