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);
});