<!DOCTYPE html>
<html lang="zh-cn">

<head>
    <title>await/async generator原理</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>

<body>
    <script>
        function* Generator() {
            const a = yield 1;
            console.log(a)
            yield 2;
            return 'end';
        }
        const gen = Generator();
        console.log(gen.next());
        console.log(gen.next('a'));
        console.log(gen.next());
        console.log(gen.next());

        // for(const i of gen) {
        //     console.log(i)
        // }

        class Context {
            prev = 0;
            next = 0;
            done = false;
        }

        function getValue(context, value) {
            let a;
            while (true) {
                context.prev = context.next;
                switch (context.next) {
                    case 0:
                        context.next = 2;
                        context.done = false;
                        return 1;
                    case 2:
                        a = value;
                        console.log(a);
                        context.next = 4;
                        context.done = false;
                        return 2;
                    case 4:
                        context.done = true;
                        context.next = 'end';
                        return 'end';
                    case 'end':
                        context.done = true;
                        return;
                }
            }
        }

        function Gen() {
            const context = new Context();
            return {
                next: function (value) {
                    return {
                        value: getValue(context, value),
                        done: context.done
                    }
                }
            }

        }

        const gen1 = Gen();
        console.log(gen1.next());
        console.log(gen1.next('a'));
        console.log(gen1.next());
        console.log(gen1.next());




        function asyncFunc() {
            awaitfunc(1);
            awaitfunc(2);
            awaitfunc('end');
        }

        function next(value, done) {
            return {
                value,
                done
            }
        };

        function awaitfunc(value) {
            next(value);
        }

        function foo() {
            const gen2 = Generator();
            return new Promise((resolve, reject) => {
                function next() {
                    const obj = gen2.next();
                    console.log(obj);
                    const { value, done } = obj; 
                    if (!done) {
                        Promise.resolve(value).then(val => next(val))
                    }
                    return value;
                }
                const value = next();
                resolve(Promise.resolve(value));
            })

        }
        foo().then(res => {
            console.log(res)
        });
    </script>
</body>

</html>