美文网首页
async 原理很难? 25行搞定

async 原理很难? 25行搞定

作者: 不算程序员 | 来源:发表于2021-05-07 18:51 被阅读0次

    注视都写到了代码里面,方面解释和理解!

    const {
        log
    } = console
    // 先来看一下迭代器
    // for await 
    const testAsync = (tips, time = 1000) => new Promise(res => setTimeout(() => res(tips), time))
    /**
     * for await ES2020新增
     */
    let arr = [testAsync('我', 1000), testAsync('出', 2000), testAsync('现', 3000), testAsync('了', 4000)]
    async function par1(a) {
        for await (let key of a) {
            log(key)
        }
    }
    // par1(arr) // 测试可打开
    
    // 看起来更便捷了吧 -- ES7
    async function par2(a) {
        for (let key of a) {
            let res = await key
            log(res, key)
            // 就是then的简化版而已
            // key.then(res => {
            //     log(res)
            // })
        }
    }
    
    // par2(arr) // 测试可打开
    
    // 先来看下genertor是什么玩意! 除去权威指南版本,全程自我理解
    
    function* genertorStudy() {
        let data1 = yield testAsync('第一步')
        log(data1, '我执行了')
        let data2 = yield testAsync('第二步了')
        log(data2, '又被执行了')
        return '啊波次的呢'
    }
    // 以下就是(asnyc)雏形;只不过是手动化的 
    let pCor = genertorStudy(); // 創建生成器
    // log(pCor) // Object [Generator] {}
    let pOne = pCor.next(); // 执行下次Func
    // log(pOne) //  { value: Promise { <pending> }, done: false } 第一次执行到 yield 第一步 的promise, so 可以拿到$.value.then这个api
    pOne.value.then(resV => {
        // log(resV) // log -> 第一步 /////// 这个console 是可以拿到promise的值的; 这个log执行的是 yield testAsync('第一步')
        // 这里并没有当做参数进行返回到 data1 的, 所以现在还未执行 36行 "log(data1)"
        let pTwo = pCor.next(resV) // 36行 log(data1, '我执行了') ->  "第一步 我执行了"  //////// 这边"pCor.next(resV)"直接把参数返回给了赋值data1, 注意 这里是 "pCor.next";这有生成器的next传入参数,才回把值返回给等号(=)左侧
        // console.log(pTwo) // log -> { value: Promise { <pending> }, done: false } //// 这里直接拿到下一次的异步 
        pTwo.value.then(resv2 => {
            // log(resv2) //log -> 第二步了 //// 这里拿到 37行第二个promise的执行结果; 为赋值给data2
            let pThree = pCor.next(resv2) // log -> 第二步了 又被执行了 //// 执行了38行代码 依旧调用pCor
            // log(pThree) // log -> { value: '啊波次的呢', done: true } //// 注意这里的done 变为true了 也就是说这个Genertor执行到此结束
            if (pThree.done) {
                pCor.next(pThree.value)
                log(pThree.value) // 返回出去并打印
            }
    
        })
    })
    // 下面要把以上内容变成自动化, 如有不理解请对比综上代码!
    /**
     * 下面就是全部的async的原理代码了
     * @param {*} fn 
     * @returns 
     */
    function _asyncToGenerator(fn) {
        return function () {
            var gen = fn.apply(this, arguments);
            return new Promise(function (resolve, reject) {
                function step(key, arg) {
                    try {
                        var info = gen[key](arg);
                        var value = info.value;
                    } catch (error) {
                        return reject(error);
                    }
                    console.log(value)
                    if (info.done) { // genertor 的 返回值 done 代表全部执行完成
                        resolve(value);
                    } else {
                        return Promise.resolve(value).then(function (value) {
                            return step("next", value);
                        }, function (err) {
                            return step("throw", err);
                        });
                    }
                }
                return step("next");
            });
        };
    }
    export default _asyncToGenerator

    相关文章

      网友评论

          本文标题:async 原理很难? 25行搞定

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