关于javascript:es6-async-函数的实现原理

自己有幸在《深刻了解ES6》中看到如何通过自行封装生成器来执行异步工作,是它同步运行。
源码如下:

   function* queryInfo() {
        const res1 = yield new Promise((res, rej) => {
            res(200);
        });
        console.log({ res1 });
        try{
            const res2 = yield new Promise((res, rej) => {
                rej(403);
            });
            console.log({ res2 });
        }catch(e){
            console.log("res2谬误:", e)
        }

        const res3 = yield new Promise((res, rej) => {
            res(304);
        });
        console.log({ res3 });
    }

    function run(gnFn) {
        // 创立迭代器
        const gn = gnFn();

        // 开启迭代
        let res = gn.next();

        (function step() {
            if (!res.done) {
                const promise = Promise.resolve(res.value);

                promise.then(value => {
                    res = gn.next(value);
                    step();
                }).catch(e => {
                    res = gn.throw(e);
                    step();
                })
            }
        })()
    }

    run(queryInfo); // {res1: 200} res2谬误:403 {res3: 304}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理