async await
co
let fs = require('fs');
// let co = require('co');
function readFile(filename) {
return new Promise(function(resolve,reject) {
fs.readFile(filename,'utf8',function(err,data) {
err?reject(err):resolve(data);
})
})
}
function *read() {
console.log('开始')
let a = yield readFile('1.txt')
console.log(a)
let b = yield readFile('2.txt')
console.log(b)
let c = yield readFile('3.txt')
console.log(c)
return c
}
function co(gen) {
let it = gen();// 我们要让我们的生成器持续执行
return new Promise(function(resolve,reject) {
!function next(lastVal) {
let {value , done } = it.next(lastVal)
if(done) {
resolve(value);
} else {
value.then(next,reject)
}
}()
})
}
co(read).then(function(data) {
console.log(data)
});
// // tJ co是用来帮我们自动执行迭代器的
// function co() {
// }
// 调用生成器,返回迭代器
// let it = read();
// let r1 = it.next();
// console.log(r1);//{value:promise1,done:false}
// r1.value.then(function(data) { // 1
// let r2 = it.next(data) {value:promise2,done:false}
// r2.value.then(function(data) { // 2
// let r3 = it.next(data) {value:promise3,done:false}
// r3.value.then(function(data) { // 3
// let r4 = it.next(data) {value:promise4,done:false}
// console.log(r4)
// })
// })
// })
async await
/*
async / await 号称异步的终极解决方案
虽说它是最简单的
但是其实它只是 generator + promise 的语法糖
*/
let fs = require('fs')
let co = require('co')
function readFile(filename) {
return new Promise(function (resolve, reject) {
fs.readFile(filename, 'utf8', function (err, data) {
// throw Error('测试异常')
err ? reject(err) : resolve(data)
})
})
}
/*
1. 简洁
2. 有很好的语义
3. 可以很好的处理异步 throw error return try catch
现在 koa2 里面已经可以支持 async / await
*/
/* async function read() {
let a = await readFile('./1.txt')
console.log(a)
// try {
// let b = await readFile('./2.txt')
// } catch (e) {
// console.error(e)
// }
let b = await readFile('./2.txt')
console.log(b)
let c = await readFile('./3.txt')
console.log(c)
return 'ok'
}
read().then(function(data) {
console.log(data)
}) */
// async await 是语法糖,内部还是用 generator + promise 实现
function read() {
return co(function *() {
let a = yield readFile('./1.txt')
console.log(a)
let b = yield readFile('./2.txt')
console.log(b)
let c = yield readFile('./3.txt')
console.log(c)
return 'ok'
})
}
read().then(function(data) {
console.log(data)
})