JavaScript 用 generator 实现 async

66 阅读1分钟

这是一段摘自《你不知道的 JavaScript(中卷))》的代码。 我个人认为这是一段需要认真斟酌的代码,其中需要搞清楚 it.next() 和 yield 之间的配合关系,这样才能理解 async 和 await 这对语法糖的内在原理,让这种把异步作为实现细节抽象了出去,使得我们可以以同步顺序的形式追踪流程控制的编程模式融入到你的思想。

function request(res) {
    setTimeout(() => {
        it.next(res);
    }, 1 * 1000);
}

function* main() {
    try {
        let result = yield request('ok!');
        console.log(result);
    } catch (err) {
        console.error(err);
    }
}

let it = main();
it.next();
function handler(data) {
    return new Promise((reslove) => {
        reslove(data);
    });
}

function* main() {
    try {
        let result = yield handler('ok');
        console.log(result);
    } catch (err) {
        console.error(err);
    }
}

let it = main();
let res = it.next().value;

res.then((data) => {
    it.next(data);
});