理解NodeJs异步编程的含义
首先理解什么是异步编程
含义:
-
有异步肯定会有同步
-
凡是回调函数存在的,都是异步代码
-
先执行同步代码,看到异步代码后,将异步代码放到异步代码执行区(先不执行)
-
继续执行同步代码,当所有的同步代码执行结束后,在执行异步代码
异步代码案例:
console.log('1');
setTimeout(()=>{
console.log('2秒后再执行...');
},2000);
console.log('end');
程序执行完毕后的输出结果:
1
恩德
2秒后再执行…
总结:代码会在执行中会依次执行,但执行到回调函数,就会把回调函数放入异步代码执行区,先不执行,如果代码执行完后,再去依次执行放入异步代码执行区。
同步代码行案例:
for(let i=0;i<10;i ){
console.log(i);
}
console.log('end');
程序执行完毕后的输出结果:
0123456789
end
总结:同步代码,for循环无论执行多久,下面代码都要等待它执行完毕后才会执行。
2.为什么有异步编程
nodejs 特点是单线程、异步、非阻塞,如果代码逻辑涉及到多个回调,就会出现非常可怕的代码,不利于后期的维护。
而异步编程的作用就是提高效率,现在对程序越来越大,CPU和内存对压力也越来越大,异步可以让电脑同时处理多个事务,所以需要异步编程。
3.如何处理异步编程出现的问题
在我们项目当中,会出现一些问题,比如,拿不到值,是undefined,是因为异步编程。
解决方案:回调函数嵌套、 Promise、 await、async语法糖 变成同步
现在文件夹里有1,2,3三个txt文件,我们需要读取这三个文件,如果直接读取第一遍可能顺序对第二遍就会出现顺序混乱的情况,所以我们需要处理异步的问题,让他按顺序执行
使用回调函数嵌套代码:
const fs=require('fs')
const path =require('path')
let p1=path.join('1.txt')
let p2=path.join('2.txt')
let p3=path.join('3.txt')
fs.readFile(p1,'utf8',(err,data)=>{
if(err) throw err
console.log(data)
fs.readFile(p2,'utf8',(err,data)=>{
if(err) throw err
console.log(data)
fs.readFile(p3,'utf8',(err,data)=>{
if(err) throw err
console.log(data)
})
})
})
使用Promise代码:
// new promise 的作用:让异步代码马上执行
const fs=require('fs')
function readFile(path){
return new Promise((resolve,reject)=>{
fs.readFile(path,'utf8',(err,data)=>{
resolve(data)
})
})
}
let p1=readFile('1.txt')
let p2=readFile('2.txt')
let p3=readFile('3.txt')
p1.then(result=>{
console.log(result)
return p2
}).then(result=>{
console.log(result)
return p3
}).then(result=>{
console.log(result)
return p3
})
还可以使用 await、async语法糖 代码:
const path=require('path')
const fs=require('fs')
let p1=readFile('1.txt')
let p2=readFile('2.txt')
let p3=readFile('3.txt')
var readfile=(path)=>{
return new Promise((resolve,reject)=>{
fs.readFile(path,'utf8',(err,data)=>{
resolve(data)
})
})
}
async function exec() {
await readfile(p1).then(result => console.log(result))
await readfile(p2).then(result => console.log(result))
await readfile(p3).then(result => console.log(result))
}
exec()
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tangbcgic
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24