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 函数库的含义和用法

目录
相关文章
|
传感器 编解码 人工智能
一个强大的音视频编解码库-rkmedia的应用
一个强大的音视频编解码库-rkmedia的应用
257 0
|
2月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
58 11
|
6月前
|
数据采集 数据挖掘 Python
|
4月前
|
Shell 数据库 Python
安装graphene库
安装graphene库
|
Windows
paddleoffice库介绍
paddleoffice库介绍
148 0
paddleoffice库介绍
|
C++ Windows
VS2010下安装和使用STLport库
VS2010下安装和使用STLport库
337 0
VS2010下安装和使用STLport库
|
Python 数据格式 XML
eleme 项目使用到的库
探索eleme用到的库 xml re库 通过regex = re.compile(pattern)返回一个pattern对象, 通过该对象匹配正则表达式的字符串, 最好在模式中使用r'some'原始字符串 regex有很多的方法, 最常用的就是findall(), 因为这个方法返回的是一个字符串列...
1005 0