# async实现

使用generator实现,实际是一个自执行的generator


function spawn(genF) {
    // 始终返回Promise对象
    return new Promise((resolve, reject) => {
        const gen = genF();
        function step(nextF) {
            let next;
            try {
                next = nextF();
            } catch (error) {
                return reject(error);
            }
            if (next.done) {
                // 最后一次执行,返回执行结果
                return resolve(next.value);
            }
            Promise.resolve(next.value).then((v) => {
                step(function() { return gen.next(v); })
            },() => {
                step(function(){ return gen.throw(e); })
            });
        }
        step(function() {
            // 首次执行 执行第一个await语句
            return gen.next();
        });
    });
}


function getUser(name) {
    console.log('beofr')
    return spawn(function* () {
        yield new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve(name);
            }, 1000);
        });
        yield 1;
        return 'a';
    });
}