• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > Node.js中async的用法是什么

Node.js中async的用法是什么

作者:站长图库 字体:[增加 减小] 来源:互联网 时间:2022-04-29

站长图库向大家介绍了Node.js,async的用法等相关知识,希望对您有所帮助

在nodejs中,async关键字可以用于定义一个函数,当async函数被调用时,会返回一个Promise,当async函数返回一个值时,这个Promise就会被实现,当函数抛出一个错误时,Promise就会被拒绝。


Node.js中async的用法是什么


nodejs中async的用法是什么

1、什么是 async 函数

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

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)


2、向 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)


3、Async 函数的最佳实践

3.1 在 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)}))


3.2 并行执行

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

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 方法。


3.3 错误处理

考虑下面这个例子:

async function main () { await new Promise((resolve, reject) => {  reject(new Error('error')) })}main() .then(console.log)

当执行这段代码的时候,你会看到类似这样的信息:

(node:69738) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: error

(node:69738) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

在较新的 Node.js 版本中,如果 Promise 被拒绝且未得到处理,整个 Node.js 进程就会被中断。因此必要的时候你应该使用 try-catch:

const util = require('util')async function main () { try {  await new Promise((resolve, reject) => {   reject(new Error('


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • node.js 基于 STMP 协议和 EWS 协议发送邮件
  • Node.js中async的用法是什么
  • Node.js怎么读写json文件?方法介绍
  • Node.js设置NODE_ENV时发生错误怎么解决?
  • 一招教你使用Node.js中iis部署运行node(附代码)
  • 深入了解Node.js 中的多线程和多进程
  • 聊聊Node.js中的事件驱动程序和EventEmitter类
  • 浅析node Express框架中的 res.send() 和 res.end()
  • 什么是事件循环?详解Node.js中的事件循环
  • Node.js深入学习之浅析require函数中怎么添加钩子

相关文章

  • 2022-04-29解决LNMP安装composer install时出现Warning: putenv()问题
  • 2022-04-29手把手教你在node中怎么优雅打印全链路日志
  • 2022-04-29宝塔面板数据库占用磁盘过大怎么办?
  • 2022-04-29改用Server酱Turbo版推送WordPress评论
  • 2022-04-29Photoshop制作晶莹剔透的音乐水晶球
  • 2022-04-29PHP遍历读取文件夹中图片并分页显示
  • 2022-04-29php如何将html转为图片
  • 2022-04-29飞飞CMS后台密码是什么?忘记了怎么办?
  • 2022-04-29javascript调试之console.table()
  • 2022-04-29宝塔面板忘记账号和密码怎么办?一条命令全搞定

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • WordPress多站点不支持timthumb.php解决方法
    • Illustrator CS5绘制逼真的红辣椒教程
    • 3个小时内网站被谷歌,搜搜,有道收录
    • Thinkphp volist多重循环原样输出数组key值
    • 织梦CMS导入数据库,修改数据库配置文件方法
    • 宝塔面板"Service Unavailable"503的问题怎么解决
    • Illustrator设计个性时尚风格的名片教程
    • 怎么为WordPress小工具添加CSS类选项
    • 阿里云Composer全量镜像下载配置及常见问题解答
    • Uniapp发布为H5版本时如何隐藏访问路径的#符号

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有