【问题标题】:Node.JS - Promise to Async/Await exampleNode.JS - 承诺异步/等待示例
【发布时间】:2018-01-05 04:09:54
【问题描述】:

我目前有一个使用原生 Promises 的项目。我希望将这些 Promise 迁移到 Async/Await。我在迁移它们时遇到了麻烦;我正在尝试关注this 文章。以下是需要更改为 Async/Await 的 Promises 的当前代码。

routes.js

// Importing user information
import user from '../server-controllers/user';

// User Information Route
router.get('/about', (req, res) => {
  user.profile().then((data) => {
    return res.render('user', {
      title: data,
    });
  }).catch((e) => {
    res.status(500, {
      error: e,
    });
  });
});

user.js

/*
This file contains any server side modules needed.
*/

module.exports = {
// Returns information about a user
  profile: () => {
    return new Promise((resolve, reject) => {
      const user = "John Doe";
      resolve(user);
    });
  },
};

如果有任何帮助我需要做些什么来转换这些,那将是有帮助的。我不知道代码是否需要更改 routesuser 文件(或两者)。

我在终端中遇到的错误是[object Error] { ... }

【问题讨论】:

标签: javascript node.js asynchronous promise async-await


【解决方案1】:

关于asyncawait 要记住的关键是async 函数实际上只是一个返回Promise 的函数,并允许您使用await 来解析Promises。因此,当 Promise 拒绝时,如果它是 awaited,那么您将在 await 所在的上下文中抛出错误。

所以从技术上讲,如果您想使用async/await 语法,您不需要更改user.js。您可以将routes.js 更改为:

// Importing user information
import user from '../server-controllers/user'

// User Information Route
router.get('/about', async (req, res) => {
  try {
    const data = await user.profile()
    return res.render('user', {
      title: data
    })
  } catch (error) {
    // Runs if user.profile() rejects
    return res.status(500, {error})
  }
})

但是当你使用async 函数时,user.js 更加简洁:

module.exports = {
  // Returns information about a user
  // This returns a Promise that resolves to 'John Doe'
  profile: async () => 'John Doe'
}

【讨论】:

    猜你喜欢
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 2018-02-03
    • 2018-03-05
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多