co的使用和实现原理

2021-04-13  本文已影响0人  vivianXIa

如下,node中读取文件fs.readFile,util.promisify将方法封装成promise返回。
有个想法:

const util = require('util');
const fs = require('fs')
let readFile = util.promisify(fs.readFile)
 function* read() {
     let data = yield readFile('./a.txt', 'utf8');
     data = yield readFile(data, 'utf8');
     return data;
}

接下来去调用这个read,写起来嵌套严重无法接受,于是产生了co

let it = read(); // it => next
let { value, done } = it.next();
value.then(data => {
    let { value, done } = it.next(data);
    value.then(data=>{
        let {value,done} =  it.next(data);
        console.log(value,done)
    })
})

TJ 写的 CO函数

//co可以自动帮我们去执行next
co(read()).then(data=>{
     console.log(data)
 }).catch(err=>{
     console.log(err)
 })

可以CO返回的是一个Promise,我们实现一下CO
思路:

//重要 请记下来
function co(it) {
    return new Promise((resolve, reject) => {
        // 异步的迭代  只能用递归的方法
        function next(data) {
            let { value, done } = it.next(data);
            if (done) { // 如果执行完毕则 完成
                resolve(value);
            } else {
                // 原生的promise 有优化 如果是promise 内部会直接把promise返回
                //不管是不是promise都封装一下
                Promise.resolve(value).then(next, reject)
            }
        }
       //第一次不用传值
        next();
    })
}
上一篇 下一篇

猜你喜欢

热点阅读