You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
yyccQQu, hoelshen, L-WAKE and zyjsun99huan, lbqdly, KellenHe, the-sky2018, chaoranfeng and 67 morezhangxuyang950313, peidLuo and FXHLLqq635030106, wython, wangzhiyuan2021, wuzhenquan, doulmi and 5 moreYuArtian, QinZhen001, zhangwinning, ihoneys, lsp27 and 1 more
------------------ 原始邮件 ------------------
发件人: welk <notifications@github.com>
发送时间: 2019年7月13日 17:31
收件人: Advanced-Frontend/Daily-Interview-Question <Daily-Interview-Question@noreply.github.com>
抄送: cooldrangon <2240273677@qq.com>, Comment <comment@noreply.github.com>
主题: 回复:[Advanced-Frontend/Daily-Interview-Question] 第 9 题:Async/Await 如何通过同步的方式实现异步 (#156)
题目是不是应该改成“如何通过异步的方式实现同步”?
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or mute the thread.
V8层面抛析暂停与恢复的实现原理:要搞懂函数为什么能暂停和恢复,首先要了解协程的概念。简单来说,可把协程看成是跑在线程上的任务,线程与协程之间是'1 v N'的关系,但是在线程上同一时间只能执行一个协程任务,比如当前执行的是A协程,要启动B的话A就需要将控制权交给B,这就体现在A暂停执行,B恢复执行,我们把A叫做B的父协程。
Activity
chenzesam commentedon Jul 9, 2019
no body?
wdzyy commentedon Jul 9, 2019
where is dalao?
xzzdll commentedon Jul 9, 2019
Async/Await 其实是generate函数的语法糖,想搞清楚用同步的方式实现异步只要搞清generate函数内部的机制就好了,不知道对不对- -
shizhihua666 commentedon Jul 9, 2019
Async/Await本来就是异步,那有同步可言
xzzdll commentedon Jul 9, 2019
@shizhihua666 以同步的方式实现异步,不是说他是同步
hiblacker commentedon Jul 9, 2019
这个应该是考察基本使用
NathanHan1 commentedon Jul 9, 2019
Async/Await就是一个自执行的generate函数。利用generate函数的特性把异步的代码写成“同步”的形式。
具体见这里
YOMXXX commentedon Jul 10, 2019
async await 用于把异步请求变为同步请求的方式,第一个请求的返回值作为后面一个请求的参数,其中每一个参数都是一个promise对象
例如:这种情况工作中会经常遇到
setTimeout 主要用户异步队列的形式,当然其中又分为宏观队列以及微观队列(Promise.then,process.nextTick等),比如隔1000ms执行一段逻辑代码(实际中不一定是1000ms后执行,需要考虑主任务的执行时间)
nenezsn commentedon Jul 10, 2019
@shizhihua666 厉害啊 兄弟
arcsin1 commentedon Jul 10, 2019
应该是下面这张写法吧(链式):
liuliudaren commentedon Jul 11, 2019
U waiyu good
cooldrangon commentedon Jul 12, 2019
可以参考你不知道的js一书的中册里面的生成器与迭代器章节看看
iamwelk commentedon Jul 13, 2019
题目是不是应该改成“如何通过异步的方式实现同步”?
cooldrangon commentedon Jul 13, 2019
29 remaining items
fanzye95th commentedon Aug 20, 2020
matthew-maozhu-wang commentedon Sep 7, 2020
老实说,await如何通过同步的方式实现异步不是因为await之后的所有语句都会被放到微任务队列吗?个人觉得解释async/await的时间原理什么的肯定是更好,但是他为什么“同步”了,就是因为他在执行上把await之后的语句都“异步”了,保证了await之后的语句都在await的回调之后执行吧。(小白乱说的)
mengshis commentedon Sep 16, 2020
async基础技术使用了生成器和promise,生成器是协程的实现,利用生成器实现生成器函数的暂停和恢复。
async是通过异步调用并隐式返回promise所为结果的函数。
await会默认创建一个promise对象。
flftfqwxf commentedon Dec 2, 2020
我想问问,这个题目是要解决的是什么问题?
AKclown commentedon Dec 26, 2020
this._head.element = this._head.next; 是不是应该改为 this._head = this._head.next; 才对呢
passing-j commentedon Jan 5, 2021
async/await 组合可以像写同步代码那样写异步代码。比如有 3 个 ajax 请求,每个请求都依赖上一个的结果,可以写成:
wensiyuanseven commentedon Feb 21, 2021
shifengdiy commentedon Jul 29, 2021
async awit 就是 promise.then的语法糖
等同于
注意
理论上 await 之后必须是一个promise对象,如果await之后是一个普通函数执行或者对象,会被包装成一个promise对象
lazyhero commentedon Aug 18, 2021
应该是想问 async/await (Generator)的实现,面试官期望你答出实现、场景(什么时候用await什么时候不用)和坑点,毕竟自古以来JS花活第一名,你可能不这么耍,但可能面试官觉得如果有人耍了花活,你要知道他耍的对不对,有哪些坑;
Qyokizzzz commentedon Dec 6, 2021
function fn1() {
return new Promise((resolve, reject) => {
fn2()
.then((res) => res.method())
.then((res) => resolve(res.property));
})
}
async function fn1() {
let p1 = await fn2();
let p2 = await p1.method();
return p2.property;
}
两个fn1等价。
async函数的返回值是一个Promise,await可以让代码看起来像同步。
NAZBIN commentedon Feb 27, 2022
看到没有好的答案,自己提炼总结一下。
Async/awiat诞生的背景:使用promise能很好的解决回调地狱的问题,但是这种充满了.then()方法,如果处理流程复杂,那么整段代码有很多then,会导致语义化不明确。
Async/await使用了两种技术:Promise和Generator(底层实现机制——协程)
生成器运行过程:生成器Generator是可以暂停执行和恢复执行的。可能还有人对生成器这块不理解,简单说一下:
在生成器函数内部执行一段代码,遇到yield关键字,js引擎会返回关键字后面的内容给外部,并暂停该函数的执行。外部函数可以通过next方法恢复函数的执行。
V8层面抛析暂停与恢复的实现原理:要搞懂函数为什么能暂停和恢复,首先要了解协程的概念。简单来说,可把协程看成是跑在线程上的任务,线程与协程之间是'1 v N'的关系,但是在线程上同一时间只能执行一个协程任务,比如当前执行的是A协程,要启动B的话A就需要将控制权交给B,这就体现在A暂停执行,B恢复执行,我们把A叫做B的父协程。
协程的高效性:协程是完全由程序所控制,也就是在用户态执行,这样的好处就是性能得到了很大的提升,不会像切换线程那样消耗资源。
(上面只是简单描述了协程的执行过程,其实中间还涉及到协程的调用栈切换以及协程的信息返回等等,感兴趣可以再交流)
那在JS中,生成器就是协程的一种实现方式,相信你也理解什么是生成器了。 推荐大家用Generator生成器和Promise来模拟一下async和await的实现。
通过使用生成器配合执行器,就能实现使用同步的方式写出异步代码。基本说到这已经解答了这个问题,中间过程上面的问题 可以再交流。
Yangfan2016 commentedon Aug 22, 2022
generator 实现的

eric-gitta-moore commentedon Jan 26, 2024
感觉 generator + Iterator + promise 这么理解似乎没问题,但是具体实现是这么弄得嘛,还是另有道路。google v8、spidermonkey、JavaScript core 都是这么弄的嘛也不太清楚,各个 js engine 的各个版本又是怎么实现的,有没有出入也不太清楚