co generator async await

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)
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值