js 自己最大的卖点就是异步回调,但是又总是在一路上撒泼一样在脱掉这一块外衣。
1: 最原始的回调实现
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)
})
没毛病,上面的代码很容易就实现了读取文件的操作,回调函数很方便,可惜半路杀出一个promise
2: promise 实现异步写法
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
中 迭代器是个什么东西?
3: generate 迭代器 实现异步
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
,也不单单是相对于异步请求,
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查看;这里值是抛砖引玉
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。