ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

实现co模块中的co方法

2020-06-16 11:08:08  阅读:283  来源: 互联网

标签:resolve co log res result 模块 console 方法


co模块:是为了简化状态函数的启动过程    ES6提供了co模块,又提供了co方法,用于简化状态函数的启动   当调用了co方法之后,可以通过then方法监听状态的改变   在之前,我们定义三个异步函数,让其一个接一个执行,且第一个任务处理结果传递给第二个任务,第二个任务处理的结果传递给第三个任务 代码如下:
<script>
    // 定义三个异步操作
    let task1 = () => {
        return new Promise((resolve, reject) => {
            // 1秒之后打印字符串
            setTimeout(() => {
                console.log('task1 执行完毕')
                resolve('task1');
            }, 1000)
        })
    }
    let task2 = () => {
        return new Promise((resolve, reject) => {
            // 2秒之后打印字符串
            setTimeout(() => {
                console.log('task2 执行完毕')
                // resolve('task2');
                reject('task2')
            }, 2000)
        })
    }
    let task3 = () => {
        return new Promise((resolve, reject) => {
            // 3秒之后打印字符串
            setTimeout(() => {
                console.log('task3 执行完毕')
                resolve('task3');
            }, 3000)
        })
    }
    // 让三个异步操作,一个接一个的执行,
    // 第一个任务处理结果传递给第二个任务,
    // 第二个任务处理的结果传递给第三个任务
    function *main(result) {
        // 执行第一个任务
        result = yield task1(result);
        console.log(11, result);
        // 执行第二个任务
        result = yield task2(result);
        console.log(22, result);
        // 执行第三个任务
        result = yield task3(result);
        console.log(33, result);
        // 返回最终的结果
        return result;
    }
    // 启动程序
    let m = main('red'); 
    // 执行第一个任务
    // 第一次传递不需要接收参数
    m.next().value.then(() => {
        // 执行第二个任务
        m.next('green').value.then(() => {
            // 执行第三个任务
            m.next('yellow').value.then((res) => {
                console.log('最终的结果', res);
            }, () => {
                m.next('blue').value.then((res) => {
                    console.log('最终的结果', res);
                })
            })
        })
    })

可以看出,通过next()方法遍历通过then()方法监听,需要一层一层嵌套,于是ES6提供了co模块,又提供了co方法,用于简化状态函数的启动

代码如下

// 通过co方法启动main
co(main)
    // 直接监听最终的结果
    .then(res => console.log('最终结果是:', res), 
            err => console.log('执行失败了', err))

实现co方法:

function co(gen) {
        // 返回一个promise方法
        return new Promise((resolve, reject) => {
            // 执行generator函数
            let g = gen();
            // 定义递归函数
            function myNext(res) {
                // 定义运行结果
                let result;
                // 为了防止代码出现错误 我们可以将语句放入try catch中
                try {
                    result = g.next(res);
                } catch(e) {
                    // 出现错误程序中断
                    return reject(e);
                }
                // 一旦遍历完成,终止执行
                if(result.done) {
                    return resolve(result.value);
                }
                // 进入下一项
                result.value.then(() => {
                    myNext(result.value);
                })
                .catch(err => console.log(err))
            }
            // 执行next
            myNext();
        })
    }

 

标签:resolve,co,log,res,result,模块,console,方法
来源: https://www.cnblogs.com/yess/p/13139828.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有