24 # co 库的实现

简介: 24 # co 库的实现

下面实现 co 库核心优化一下上节的这段代码

const fs = require("fs").promises;
// 代码更像是同步的,但是执行还是异步的
function* read() {
    let name = yield fs.readFile("./file/name.txt", "utf-8");
    let age = yield fs.readFile("./file/age.txt", "utf-8");
    return { name, age };
}
// 下面是需要优化的代码
let it = read();
let { value, done } = it.next();
value.then((data1) => {
    console.log("name---->", data1);
    let { value, done } = it.next(data1);
    value.then((data2) => {
        let { value, done } = it.next(data2);
        console.log("age---->", data2);
        console.log("return---->", value);
        // 还可以抛出异常
        // it.throw("泰裤辣");
    });
});

简单实现一下 co 库:能将 generator 函数变成一个 promise 返回

const co = (it) => {
    return new Promise((resolve, reject) => {
        // 异步迭代靠的是回调函数
        function next(data) {
            let { value, done } = it.next(data);
            if (!done) {
                // value 可能不是promise,需要包装一下
                Promise.resolve(value).then(next, reject);
            } else {
                resolve(value);
            }
        }
        // 先调用一次
        next();
    });
};
co(read()).then((data) => {
    console.log("data---->", data);
});

async await 替换掉了 generator 和 co,默认 async 函数执行后返回的就是一个 promise(async + await = generator + co)

co 库

推荐阅读阮一峰大佬的:co 函数库的含义和用法

目录
相关文章
|
9月前
|
传感器 编解码 人工智能
一个强大的音视频编解码库-rkmedia的应用
一个强大的音视频编解码库-rkmedia的应用
186 0
|
1月前
|
API 开发工具 数据库
框架和库:你需要知道的一切
框架和库:你需要知道的一切
23 0
|
7月前
|
JavaScript 前端开发 API
什么是框架和库?
什么是框架和库?
45 0
day24-库的使用(2022.2.21)
day24-库的使用(2022.2.21)
125 0
|
Windows
paddleoffice库介绍
paddleoffice库介绍
121 0
paddleoffice库介绍
|
C++ Windows
VS2010下安装和使用STLport库
VS2010下安装和使用STLport库
305 0
VS2010下安装和使用STLport库
|
Python 数据格式 XML
eleme 项目使用到的库
探索eleme用到的库 xml re库 通过regex = re.compile(pattern)返回一个pattern对象, 通过该对象匹配正则表达式的字符串, 最好在模式中使用r'some'原始字符串 regex有很多的方法, 最常用的就是findall(), 因为这个方法返回的是一个字符串列...
971 0
2017 年 33 个重要的库
2017年33个重要的库(一)2017年33个重要的库(二)
622 0