Node.js中的异步编程,个人理解及分化讲解
Nodejs
Nodejs本身是单线程的,底层核心库是Google开发的V8引擎,而主要负责实现Nodejs的异步功能的是一个叫做libuv的开源库,github上可以找到它。
异步编程
Nodejs异步编程是指执行到一个方法的时候,不立即执行,而是加入到队列,然后接着往下执行,Nodejs内部是适时执行队列的方法,执行完执行回调方法(如果有回调方法)。由于只Nodejs 是单线程,异步编程模型保证了Nodejs快速响应,充分利用CPU。
下列代码是打印根目录下一个名为a的txt文件内容
const fs = require(‘fs’)
const path = require(‘path’)
let a_path = path.join(__dirname, ‘file’, ‘a.txt’)
fs.readFile(a_path, ‘utf8’, (err, data) => {
if (err) throw err
console.log(data)
})
因为fs.read()本身是一个异步函数,所以返回值是异步的,必须在回调函数中捕获,所以需要这样写,但是一两个异步还好,但是如果多了的话,就是程序员的噩梦之一回调地狱
回调地狱
const fs = require(‘fs’)
const path = require(‘path’)
let a_path = path.join(__dirname, ‘file’, ‘a.txt’)
let b_path = path.join(__dirname, ‘file’, ‘b.txt’)
let c_path = path.join(__dirname, ‘file’, ‘c.txt’)
fs.readFile(a_path, ‘utf8’, (err, data) => {
if (err) throw err
console.log(data)
fs.readFile(b_path, ‘utf8’, (err, data) => {
if (err) throw err
console.log(data)
fs.readFile(c_path, ‘utf8’, (err, data) => {
if (err) throw err
console.log(data)
})
})
})
连续的回调函数的嵌套,会使得代码变得冗长,易读性大幅度降低并且难以维护,这种情况被称作回调地狱,所以为了解决这个问题,ES标准推出了一套异步编程解决方案
Promise
promise本身是一个对象,但是可以看做是是一种工具,用来解决的是Nodejs异步接口串行执行导致的回调地狱问题,它本身对代码逻辑没有影响
以下代码是promise的异步代码
function readFile(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, ‘utf8’, (err, data) => {
resolve(data)
})
})
}
let p1 = readFile(a_path)
p1.then(data => {
console.log(data)
return readFile(b_path)
}).then(data => {
console.log(data)
return readFile(c_path)
}).then(data => {
console.log(data)
})
与之前的异步代码不同的是,我们在异步函数外层包了一层返回promise对象的函数,promise对象向自己包裹的函数里传入了两个函数参数resolve和reject,在异步函数内部通过调用resolve向外传递操作成功数据,调用reject向外传递错误信息。
总结一下异步编程:多个方法各自实行,互不干涉,不像是同步编程,只有上面的执行完毕才可以进行下面的代码,异步编程的优点就是以这种方式写出的代码可读性可维护性可以说是非常强,完全没有之前的回调地狱带来的副作用
Node.js中的异步编程,个人理解及分化讲解相关推荐
- 话说js中的异步编程。
转载自品略图书馆 http://www.pinlue.com/article/2020/07/0412/3110968788347.html JS异步编程模型 在理解js异步编程时, 我们先再心中想一 ...
- 浅谈js中的异步编程
转载自品略图书馆 http://www.pinlue.com/article/2020/07/0412/3110968788347.html JS异步编程模型 在理解js异步编程时, 我们先再心中想一 ...
- promise 的基本概念 和如何解决js中的异步编程问题 对 promis 的 then all ctch 的分析 和 await async 的理解
* promise承诺 * 解决js中异步编程的问题 * * 异步-同步 * 阻塞-无阻塞 * * 同步和异步的区别? 异步;同步 指的是被请求者 解析:被请求者(该事情的处理者)在处理完事情的时候的 ...
- 17.Node.js 回调函数--异步编程
转自:http://www.runoob.com/nodejs/nodejs-tutorial.html Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调后程 ...
- ENSP如何开启服务器的http_如何使用HTTP模块在Node.js中创建Web服务器(上)
当你在浏览器中查看网页时,其实是在向互联网上的另一台计算机发出请求,然后它会将网页提供给你作为响应.你通过互联网与之交谈的那台计算机就是Web服务器,Web服务器从客户端(例如你的浏览器)接收HTTP ...
- JS笔记(20): JS中的同步编程和异步编程
铺垫:关于定时器 定时器:设定一个定时器,并且设定了等到的时间,当到达指定的时间,浏览器会把对应的方法执行 1)常用的定时器 1.setTimeout(function,intarval) 执行一次 ...
- 深入理解 Node.js 中的 Worker 线程
多年以来,Node.js 都不是实现高 CPU 密集型应用的最佳选择,这主要就是因为 JavaScript 的单线程.作为对此问题的解决方案,Node.js v10.5.0 通过 worker_thr ...
- 使用 node.js 进行服务器端 JavaScript 编程
node.js 是一个可以使用 JavaScript 开发服务器端应用的平台.它依托于 Google V8 JavaScript 引擎,并采用事件 I/O 的架构,可以用来创建高性能服务器.本文详细介 ...
- node.js中公培训笔记大全(讲的一般,小白基础入门)
day01 本阶段的授课内容为 ES6 2天-3天 NodeJS 2天-3天 express 2天-3天 webpack 1天 MySQL数据库 2天 实战项目 2天 今天的授课内容为 1.ES5-严 ...
最新文章
- python复制文件夹到另一个目录_【python】复制文件到另一个相同目录的文件夹中...
- 自学python三个月能赚钱吗-自学Python三个月能赚钱吗?
- 如何判断mysql某个数据库某张表是否存在
- python脚本之家 包的创建和调用_python基础之包的导入和__init__.py的介绍
- truncate python是删除文件内容吗_Python 文件 truncate() 方法
- 2019年,50万大数据DT粉丝都爱的10本书
- adb logcat 通过包名过滤日志并输出到txt文件
- 关于职场晋升,这是我的7点具体建议
- 让所有连接都弹出新窗口
- 听听【八年阿里架构师】怎样讲述Dubbo和Spring Cloud微服务架构
- 合肥青少年信息学计算机竞赛试题,合肥市第三十一届青少年信息学(计算机)竞赛 小学组试题...
- Jenkins 构建项目流程
- 机器学习方法分类总结
- golang中的URL 的编码和解码(转)
- LISA: A Learned Index Structure for Spatial Data
- Xtrareport 多栏报表
- 如何进行复盘分析,复盘分析的步骤是什么?
- vue与C#实现自定义表单审批流程构建-后端
- [codeforces 1379B] Dubious Cyrpto 公式推导
- 《scikit-learn机器学习》决策树③ -泰坦尼克号幸存者预测【思路+代码】