const util = require('util');
const fs = require('fs');
let readFile = util.promisify(fs.readFile)
// generator 生成器函数
function * read() {
let data = yield readFile('./a.txt','utf8');
data = yield readFile(data,'utf8');
return data;
}
// 方法一:Generator 生成器
let it = read(); // 生成器函数返回一个 Iterator 迭代器对象
let {value:v1, done:d1} = it.next(); // 注意:第一个next传参是无效的
v1.then(data=>{
console.log(data) // b.txt
let {value:v2, done:d2} = it.next(data); // 将第一次的结果作为第二次的入参
return v2
}).then(data=>{
console.log(data) // 执行结果:c
})
// 方法二:使用 co 库
const co = require('co')
// co 方法:包装 generator 生成器函数,内部自动执行完成,返回一个 promise
co(read()).then(data=>{
console.log(data); // 执行结果:c
})
// 方法三:使用 async/await
async function read() {
let data = await readFile('./a.txt','utf8');
data = await readFile(data,'utf8');
return data;
}
// async 函数执行完成后,返回一个 promise
read().then(data=>{
console.log(data)
})
之前,使用 generator + co 组合,已经让代码看上去很像是同步了,但仍需要 co 库的支持;使用 async/await:在外层 function 前添加 async;await 右侧的方法返回 promise;无需 co 库支持即可实现;这样,代码看上去与“同步编码”无任何明显差异,有效避免了嵌套回调问题;