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

标签 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 有很多技巧,例如自动包装 promise ,那么我的直觉是正确的吗?

最佳答案

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

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

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

其次,如果调用者想在 getUsers() 函数上使用 await,那么它需要返回一个 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 而言,您只需从计划使用 await 的函数中返回一个 promise。


回顾一下:

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

仅供引用,这是一个非常好的、简短而甜蜜的 review of async/await以及它们如何与 promise 交互。

关于javascript - 声明为异步的方法的正确语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42172596/

相关文章:

javascript - polymer 2.x : Behavior mixins using class extension; error: Class constructor cannot be invoked without 'new'

javascript - 是否可以在子类 ES 2015 的实例中调用重写的方法?

javascript - 页面加载时显示与单选按钮匹配的文本字段

javascript - 如何使用 JQuery 在我的导航栏中点击滑动条

node.js - Promise.all无返回res图nodejs

c# - 进行长时间运行的异步调用就这么简单吗?

node.js - 在集合插入之前等待完成 Meteor.call

javascript - fetch 原生支持多文件上传吗?

javascript - 如何使用客户端 JavaScript 在没有框架的情况下从 MongoDB 和 Node.js 服务器查找并返回数据?

javascript - 当子类化内置函数时重写构造函数伪函数是否安全?