- 同步
- 就是一件事一件事的执行,只有执行完当前任务,才会执行后一个任务。
- 异步
- 异步就是在执行主程序的时候发现有异步任务,他会把异步任务摘出来放进异步处理,继续往下走执行到最后,通过回调函数就会执行,这就是异步
- 凡是回调函数存在,都是异步代码
- 异步 IO 是指应用层以异步的方式去读取非阻塞 IO 的方式,只有非阻塞 IO 才能执行异步操作。Node 底层采用线程池的原理管理异步 IO,所以我们通常所的 单线程是指 Node 中 JavaScript 的执行是单线程的,但 Node 本身是多线程的。
- setTimeout(function fn(){
console.log("Hello JS");
},1000);
console.log('sync things');
setTimeout就是一个异步任务,当JS引擎执行到setTimeout的时候发现它是个异步任务,则会把这个任务挂起,继续执行后面的代码。知道1000ms后,回调函数fn 才会执行,
- 常见异步模式
- 回调函数
- 事件监听
- promise
- 在实践中处理的异步问题
- 运行过程是这样的依次读取三个文本文档内容,但是按照正常读取的情况顺序会打乱
- 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)
})
})
})
运行结果是打乱的现象,就是因为异步的关系
怎么解决呢 使用promise方法
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')
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)
})
就可完美的解决了
当然方法并不唯一的还可以使用语法糖
await 和async