美文网首页
co的使用和实现原理

co的使用和实现原理

作者: vivianXIa | 来源:发表于2021-04-13 15:12 被阅读0次

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

  • 先读a.txt的内容,内容为b.txt;
  • 再去读b.txt的内容并返回
  • 用yield实现于是有了如下代码
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函数

  • 首先安装包 npm install co
  • 在js文件中引入CO,const co = require('co');
  • 使用CO
//co可以自动帮我们去执行next
co(read()).then(data=>{
     console.log(data)
 }).catch(err=>{
     console.log(err)
 })

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

  • 将generator函数传入co方法,会自动调用next方法,直到next执行结果为true的时候,调用resolve返回结果,否则的话迭代执行next方法并把上次结果传递过去。。。
  • 因为next执行的结果可能是普通值或者promise 所以都统一封装一下Promise.resolve(value).then(next, reject)
//重要 请记下来
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();
    })
}

相关文章

  • co的使用和实现原理

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

  • Java中的Copy-On-Write容器

    聊聊并发-Java中的Copy-On-Write容器 CopyOnWriteArrayList的实现原理在使用Co...

  • 源码

    一,HashMap HashMap实现原理 具体原理参考文章:http://zhangshixi.iteye.co...

  • JS中同步心得

    不使用co模块 异步代码 2种方式 then 实现同步 async 实现同步 co模块实现同步(co+yield)...

  • J.U.C

    1 atomic 类 AtomicInteger内部原理:底层利用硬件cas实现原子的比较和修改Unsafe.co...

  • no.2-10/23/2018

    一:预定目标 继续对GAN的学习。掌握原始GAN的思想和实现,接触其他GAN变形的原理和实现方法。这周学习了 Co...

  • `keyset`的使用和实现

    keyset的使用和实现 HashMap(2): EntrySet、KeySet实现原理 HashMap中keyS...

  • java——文件合并

    文件合并的原理和使用SequenceInputStream,实现文件碎片的合并

  • Redux中Provider小结

    实现原理: Provider实现原理是使用React的隐藏属性Contexts实现。 作用: Provider是容...

  • WebViewJavascriptBridge的使用和实现原理

    在HTML添加交互代码 app中使用WebViewJavascriptBridge的代码 上面的代码是WebVie...

网友评论

      本文标题:co的使用和实现原理

      本文链接:https://www.haomeiwen.com/subject/unfclltx.html