可以看到,仅仅一个async其实做了不少工作。核心就是两个,产出一个兼容版本的generator和使用promise,回到这节的问题上,答案就是:
return new Promise(function (resolve, reject) {});没错,就是返回一个Promise,内部会根据状态及决定是否继续执行下一个Promise.resolve().then()。
如果async函数内有很多其他操作的代码,那么while会跟着变化,利用prev和next来管理执行顺序。这里就不具体分析了,自己写个例子就明白了~
可以通过babel在线转换,给自己一个具象的感知,更利于理解。
为什么下面这种函数外的console不会等待,函数内的会等待? async function fn() { await (async () => { await new Promise((r) => { setTimeout(function () { r(); }, 2000); }); })(); console.log('你好'); } fn(); console.log(123);因为解析后的console.log(123); 是在整个语法糖之外啊,log 和 fn 是主协程序,fn内是辅协程。不相干的。
总结有句话怎么说来着,会者不难,难者不会。所以人人都是大牛,只是你还没发力而已,哈哈~
笔者后来思考觉得这种写法完全就是回调函数的替代品,而且增加了空间,加深了调用堆栈,或许原生的写法才是效率最高的吧。
不过,需要良好的编码规范,算是一种折中的方式了。毕竟用这种方式来写业务事半功倍~
对于本文观点,完全是个人阅读后的思考,如有错误,欢迎指正,我会及时更新,避免误导他人。
拜了个拜~