generator + co === async await
async function 等价于:
-
把函数转换成 generator
-
把每个 await 转换成 yield
-
自动执行 generator(像 co 那样)
浏览器中的 async/await 底层原理就是这样(但更复杂且优化很多)
let fs = require("fs").promises;
function* read() {
try {
// 这个代码肯定是异步的,但是写的像同步代码
let url = yield fs.readFile("./fileUrl1.txt", "utf8");
let name = yield fs.readFile(url, "utf8");
return name;
} catch (e) {
console.log(e, 55);
}
}
/*
let it = read();
let { value, done } = it.next();
if (!done) {
value.then((data) => {
let { value, done } = it.next(data);
if (!done) {
value.then((data) => {
let { value, done } = it.next(data);
console.log(value, done);
});
}
});
}
*/
function co(it) {
// 串行执行,基于回调
return new Promise((resolve, reject) => {
function next(data) {
let { value, done } = it.next(data);
if (!done) {
Promise.resolve(value).then(
(data) => {
next(data);
},
(err) => {
it.throw(err);
}
);
} else {
resolve(value);
}
}
next();
});
}
co(read()).then((data) => {
console.log(data);
});

浙公网安备 33010602011771号