js 本身最大的卖点就是异步回调,可是又老是在一路上撒泼同样在脱掉这一块外衣。
1: 最原始的回调实现javascript
const fs = require('fs') function readFileOne(path,callback){ fs.readFile(path,function(err,res){ if(!err) { callback.call(null,null, res.toString() ) }else{ callback.call(null,err) } }) } readFileOne('./test.json',function(err,res){ console.log(res) })
没毛病,上面的代码很容易就实现了读取文件的操做,回调函数很方便,惋惜半路杀出一个promisejava
2: promise 实现异步写法node
const fs = require('fs') function readText(){ return new Promise((resolve,reject)=>{ fs.readFile('./test.json',(err,res)=>{ if(err){ reject(err) }else{ resolve(res) } }) }) } readText().then((res)=>{ console.log(res.toString()) }).catch((e)=>{ console.log(e) })
也彻底没有毛病,实现手段上更加流化,实现了异步代码同步化写,然毛线,又出来一个 Generate],这个是个什么东西?能够看个人另外一篇文章 javascript
中 迭代器是个什么东西?json
3: generate 迭代器 实现异步promise
const fs = require('fs') // 8.x版本node内置将函数转化为`pronmise`的方法 const { promisify } = require('util') const proFiles = promisify(fs.readFile) function* readFile(path){ yield proFiles(path) } var g = readFile('./test.json') g.next().value.then((r)=>{ console.log(r.toString() ) })
4: generate 尚未用熟练,es7最终出了终极解决方法 Async 异步
async
更加语义化比generator
,也不仅仅是相对于异步请求,async
const proFiles = promisify(fs.readFile) const readFile = async function (path){ let res = await proFiles(path) return res } readFile('./test.json').then((res)=>{ console.log(res.toString()) })
这个是最简单的 async同步使用方式,更加复杂的能够i查看;这里值是抛砖引玉函数