聊聊Node.js中怎么用async函数

聊聊Node.js中怎么用async函数

借助于新版 V8 引擎,Node.js 从 7.6 开始支持 async 函数特性。今年 10 月 31 日,Node.js 8 也开始成为新的长期支持版本,因此你完全可以放心大胆地在你的代码中使用 async 函数了。在这边文章里,我会简要地介绍一下什么是 async 函数,以及它会如何改变我们编写 Node.js 应用的方式。

什么是 async 函数

利用 async 函数,你可以把基于 Promise 的异步代码写得就像同步代码一样。一旦你使用 async 关键字来定义了一个函数,那你就可以在这个函数内使用 await 关键字。当一个 async 函数被调用时,它会返回一个 Promise。当这个 async 函数返回一个值时,那个 Promise 就会被实现;而如果函数中抛出一个错误,那么 Promise 就会被拒绝。【相关教程推荐:nodejs视频教程、编程教学】

await 关键字可以被用来等待一个 Promise 被解决并返回其实现的值。如果传给 await 的值不是一个 Promise,那它会把这个值转化为一个已解决的 Promise。

const rp = require('request-promise')async function main () { const result = await rp('https://google.com') const twenty = await 20 // 睡个1秒钟 await new Promise (resolve => {  setTimeout(resolve, 1000) }) return result}main() .then(console.log) .catch(console.error)

登录后复制

向 async 函数迁移

如果你的 Node.js 应用已经在使用Promise,那你只需要把原先的链式调用改写为对你的这些 Promise 进行 await。

如果你的应用还在使用回调函数,那你应该以渐进的方式转向使用 async 函数。你可以在开发一些新功能的时候使用这项新技术。当你必须调用一些旧有的代码时,你可以简单地把它们包裹成为 Promise 再用新的方式调用。

要做到这一点,你可以使用内建的 util.promisify方法:

const util = require('util')const {readFile} = require('fs')const readFileAsync = util.promisify(readFile)async function main () { const result = await readFileAsync('.gitignore') return result}main() .then(console.log) .catch(console.error)

登录后复制

Async 函数的最佳实践

在 express 中使用 async 函数

express 本来就支持 Promise,所以在 express 中使用 async 函数是比较简单的:

const express = require('express')const app = express()app.get('/', async (request, response) => { // 在这里等待 Promise // 如果你只是在等待一个单独的 Promise,你其实可以直接将将它作为返回值返回,不需要使用 await 去等待。 const result = await getContent() response.send(result)})app.listen(process.env.PORT)

登录后复制

但正如 Keith Smith 所指出的,上面这个例子有一个严重的问题——如果 Promise 最终被拒绝,由于这里没有进行错误处理,那这个 express 路由处理器就会被挂起。

为了修正这个问题,你应该把你的异步处理器包裹在一个对错误进行处理的函数中:

const awaitHandlerFactory = (middleware) => { return async (req, res, next) => {  try {   await middleware(req, res, next)  } catch (err) {   next(err)  } }}// 然后这样使用:app.get('/', awaitHandlerFactory(async (request, response) => { const result = await getContent() response.send(result)}))

登录后复制

并行执行

比如说你正在编写这样一个程序,一个操作需要两个输入,其中一个来自于数据库,另一个则来自于一个外部服务:

async function main () { const user = await Users.fetch(userId) const product = await Products.fetch(productId) await makePurchase(user, product)}

登录后复制

在这个例子中,会发生什么呢?

你的代码会首先去获取 user,

然后获取 product,

最后再进行支付。

如你所见,由于前两步之间并没有相互依赖关系,其实你完全可以将它们并行执行。这里,你应该使用 Promise.all 方法:

async function main () { const [user, product] = await Promise.all([  Users.fetch(userId),  Products.fetch(productId) ]) await makePurchase(user, product)}

登录后复制

而有时候,你只需要其中最快被解决的 Promise 的返回值——这时,你可以使用 Promise.race 方法。

更多node相关知识,请访问:nodejs 教程!

以上就是聊聊Node.js中怎么用async函数的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2696813.html

(0)
上一篇 2025年3月7日 18:35:57
下一篇 2025年3月7日 18:36:13

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 一文带你了解node中的的模块系统

    本篇文章带大家进行node学习,深入浅出的了解node中的的模块系统,希望对大家有所帮助! 两年前写过一篇文章介绍模块系统:理解前端模块概念:CommonJs与ES6Module。这篇文章的知识面都是针对刚入门的,比较浅显。在这也纠正文章的…

    2025年3月7日 编程技术
    200
  • 一文详解Node中express的身份认证

    本篇文章带大家了解node中的express框架,介绍一下express中的身份认证,希望对大家有所帮助! Web开发模式 目前主流的Web开发模式有两种: 基于服务端渲染的传统Web开发模式 服务端渲染的概念:服务器发送给客户端的HTML…

    2025年3月7日 编程技术
    200
  • 一文浅析node中如何使用消息队列

    什么是消息队列?下面本篇文章带大家了解一下消息队列的基本概念,介绍一下node中如何使用消息队列,希望对大家有所帮助! 1.消息队列 什么是消息队列 消息队列就是消息的传输过程中保存消息的容器,本质是一个队列(先进先出) 消息指的是需要传输…

    2025年3月7日 编程技术
    200
  • 一文聊聊node后端路由自动加载

    本文适宜人群 有一定基础的Node.js开发人员 难易程度 中等 背景 今天来谈谈node后端中路由的问题。【相关教程推荐:nodejs视频教程】 我们前端同学或者是nodejs服务端的同学,在你们使用express和koajs写接口的时候…

    2025年3月7日 编程技术
    200
  • 浅析JS的异步函数async/await

    本篇文章带大家了解一下javascript的异步函数 async/await,希望对大家有所帮助! ES7 引入的 async/await 是对 JavaScript 异步编程的一种改进,它提供了使用同步样式代码异步访问资源的选项,而不会阻…

    2025年3月7日
    200
  • 一文详解如何在前端中动态生成API接口

    本篇文章给大家带来了关于前端的相关知识,其中主要介绍了怎么在前端中动态的生成api接口 ,下面一起来看一下,希望对大家有帮助。 在ts横行的时代,接口请求和返回参数定义类型成了繁琐的一件事情,在这样的情况下,我们可以通过node服务,来进行…

    2025年3月7日 编程技术
    200
  • 手把手带你开发一个node切换源小工具

    node怎么切换源?下面本篇文章带大家手搓一个node切换源小工具,希望对大家有所帮助! 嗨嗨嗨,又到了写轮子环节了,为什么要写这个东西呢? 应为npm自带的源下载东西灰常慢 目前已经有一款工具了nrm 也是做切换源的 例如tabao源,腾…

    2025年3月7日 编程技术
    200
  • 【整理分享】判断当前使用哪种npm包管理器的方法

    如何判断当前的 npm 包管理器?下面本篇文章给大家整理分享判断当前使用哪种npm包管理器的方法,希望对大家有所帮助 使用 npm 进行依赖安装比较常见。但随着项目体积、数量增加,npm 就会出现安装速度慢,体积过大的问题。使用 yarn …

    2025年3月7日
    200
  • 浅析node怎样链接多个JS模块

    有时候是不是会有这样的疑问:纷繁的功能文件,到最后是怎么组合成起来并且在浏览器中展示的?为什么需要 node 环境?下面本篇文章给大家介绍一下node是怎样把多个js模块链接在一起的?希望对大家有所帮助! 一、个人理解 浏览器本身只能做一些…

    2025年3月7日 编程技术
    200
  • 浅析Node常见的三种关于安全方面的处理

    本篇文章带大家聊聊node常见的三种安全防范手段,主要讲解在开发node服务端的时候, 三种关于安全方面的处理。 一、预防方式 1、 sql注入 这是一个最原始也最简单的攻击, 从 web2.0 开始有了人机交互后就出现的一种攻击方式 其主…

    2025年3月7日
    200

发表回复

登录后才能评论