异步和同步的机制问题

  1. 同步
  • 就是一件事一件事的执行,只有执行完当前任务,才会执行后一个任务。
  1. 异步
  • 异步就是在执行主程序的时候发现有异步任务,他会把异步任务摘出来放进异步处理,继续往下走执行到最后,通过回调函数就会执行,这就是异步
  • 凡是回调函数存在,都是异步代码
  • 异步 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 才会执行,

  1. 常见异步模式
  • 回调函数
  • 事件监听
  • promise
  1. 在实践中处理的异步问题
  • 运行过程是这样的依次读取三个文本文档内容,但是按照正常读取的情况顺序会打乱
 - 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值