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

时间:2017-02-11 05:30:31

标签: 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有许多技巧,例如自动包装承诺,我的直觉也是正确的吗?

1 个答案:

答案 0 :(得分:2)

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

首先,如果您打算在函数内部使用async,则只需要await作为函数定义的一部分。如果您未在内部使用await(您的代码未显示),则不需要定义的async部分。所以,它可能就是这样:

getUsers(res) {
  User.findAll().then(users => res.json(users));
}   

其次,如果调用者想在await函数上使用getUsers(),那么它需要返回一个promise(如你所建议的那样)。如果调用者不使用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
  });
}

所以,原始代码可能就好了,只要调用者永远不会期望来自该函数的异步返回值(这是可能的,因为异步操作的结果是与res.json()一起发送的,并且可能是唯一需要的结果。就await / async而言,您只需要从计划使用等待的函数返回一个promise。

回顾一下:

    只有在计划在函数中使用async时才需要
  1. await。您的功能可能根本不需要async关键字。
  2. 只有当调用者希望能够通过传统的f().then()let x = await f()访问异步响应时,才需要返回的承诺。
  3. 来电者可以await未标记为async的功能。 await将从函数中获取返回值,如果返回值不是promise,则会将其包装在已解析的promise中。如果是承诺,它将等待它解决。
  4. 仅供参考,这是一个非常好,短而甜蜜的review of async/await以及它们如何与承诺互动。