nodejs 不是单线程 在博客项目中关于异步问题:
1.当用户添加一条博客时 需要通过post方式向服务器发送数据 后台获取用户以post方式拿到传送过来的数据 然后存入数据库:
上面的代码:创建一个空字符串 当用户向服务器发送请求时出发data事件将依次获取来数据进行拼接 当用户请求结束后出发end事件 将拼接后的字符串赋值给req.postData属性 理想中的代码执行顺序如下:
但是代码中的data和end事件 都是属于异步 SO 真正执行如下:
因为同步代码优先执行 异步代码等同步代码之行结束后再根据规则执行 这就造成后台接收不到传送的数据
使用Promise解决异步问题:将异步代码放入Promise中 将要传送的数据放到resolve方法中作为参数
当上面代码执行完成后才执行下面的then里面的代码 同时也回想resolve中的参数传到下面的形参result中 在将其赋值给req.postData 将后续代码放在then中
2.当nodeJS操作数据库时也存在异步:
var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'nodeblog' }); //开始连接 connection.connect(); //查询所有数据 let sql = 'SELECT * FROM student' connection.query(sql, (err, result) => { if (err) { console.log('sorry'); return; } console.log(result); }); console.log('查询结束')
上面代码的执行结果为:
说明:虽然查询学生表的代码书写在前 但是优先输出“查询结束”可见后续代码不会等到查询学生表代码执行结束后才执行
解决方法:也是通过Promise
红色框内为异步代码 黄色框内为后续代码!!!
3.使用Promise实现依次读取文件:
/**依次读取文件 */ //拿到abc三个文件的路径 使用绝对路径 const path = require('path') const fs = require('fs') let a = path.join(__dirname, '文件', 'a.txt') let b = path.join(__dirname, '文件', 'b.txt') let c = path.join(__dirname, '文件', 'c.txt') let read = path => { return new Promise((resolve, reject) => { fs.readFile(path, 'utf8', (err,data) => { resolve(data) }) }) } read(a).then(data => { console.log(data) return read(b) }).then(data => { console.log(data) return read(c) }).then(data => { console.log(data) })