JavaScript 中 async/await 有没有必要彻底搞懂?

211 天前
 shendaowu
花了两天时间把相关的东西看了个大概。然后感觉跟着例子照猫画虎应该没什么大问题了,但是自己独立写很可能会有问题。感觉理解得还不是很透彻。这种不透彻是否会导致出现什么严重的问题?我是主要看的这个: https://zh.javascript.info/async 。另外还看了一些其他相关的章节。
5062 次点击
所在节点    JavaScript
45 条回复
AoEiuV020JP
211 天前
我最近在研究 flutter 的 async/await 协程异步,作为原生开发者我感觉比较困扰的还是一段代码是主线程还是异步线程心里容易没数,很多操作希望是异步线程但实际只是异步协程,要真异步会很困难,
但方便是确实方便,省了一大堆的监听,心里能把 async/await 解读成监听的话至少不影响使用,
yor1g
211 天前
不就是 Promise 的语法糖么..
shendaowu
211 天前
@yor1g 可能是我没有赛博慧根吧。也可能是我对理解的要求比较高。比如对我来说能自己实现才是极致的理解。我连对 Promise 的理解都是磕磕绊绊的。我主贴链接里的题我都没全答对。还有可能是没时间用各种方式“玩”需要学的技术。

顺便抱怨一下,感觉大量简单的题会更有帮助一些。感觉那个网站的题太难了。
kneo
211 天前
不是嘲讽你,我有点没理解,你自己都明确觉掌握不足了。一般这就像渴了喝水一样继续找点资料看下去。你还在纠结要不要深入学习的原因是什么?不喜欢编程?没有时间?
ysc3839
211 天前
我觉得没必要了解微任务,至少我自己是没了解过,目前也没影响我用 js 写代码。async function 方面,知道实际实现是类似在 await 处拆成多个代码块就差不多了。
例如以下代码:
async function fn() {
await a;
const result = await b;
console.log(result);
}
可以实现成:
function fn() {
a.then(() => {
b.then(result => {
console.log(result);
});
});
}
能看作类似回调函数的语法糖。
不过 C++ 的 coroutine 是拆成 switch case 块,而不是拆成多个回调函数,这个了解就行。
okakuyang
211 天前
我都不知道这有啥好搞懂的,不就是用同步的语法写异步的函数,除此之外还有任何需要在意的吗?
favourstreet
211 天前
这么多层了还没有人推荐楼主去把 Monad 学明白了回来降维打击 async/await 吗
shendaowu
211 天前
@kneo 就是没时间,你猜对了。如果我财富自由了学所有主流编程语言肯定会排在前十。现在能凑合写出没什么大问题的代码就行了。
shendaowu
211 天前
@favourstreet 我没学过函数式编程,学明白 Monad 要很长时间吧?
chenliangngng
211 天前
@favourstreet 一个精巧的玩具,最直接的产物就是 Promise ,然而即使 Promise 也不是个方便理解的东西
fanyange
211 天前
一句话解释就是,async/await 是 promise 的语法糖,本质是一个普通的函数,但这个函数的返回值作为一个 promise 里 resolve 的值。其次,这个函数里调用的所有其他异步函数都可以通过 await 来得到其 resolve 之后的值,像同步函数的写法。

当然你也可以不在 async 函数体内部写 await ,那里面的异步函数就不会阻塞,各执行各的。
Rocketer
211 天前
不懂也不耽误用,想理解底层原理就去看一下 JS 事件循环
AoEiuV020JP
211 天前
@AoEiuV020JP #1 比起 async 感觉 flutter 的 async*更难搞,折腾几天的协程主要问题都在 async*和 Stream 这边,数据层层传递时还要顾及 done 和 error ,有时候必须 listen 有时候又必须 async* await for 的,
普通的 async/await 感觉主要调试时混乱一些,
shizhibuyu2023
211 天前
楼上的各位,阮一峰的 ES6 都不看的吗?
JS 的 async/await 明明是用 co 模块自动调用 Promise 的迭代器( generator 语法生成)的语法糖
网上各种带你手写的视频、文章,自己花一天时间看一遍不难吧
这些东西跟 Vue 的模板语法、React 的 JSX 语法一样,你不理解背后的原理也能写,但去了解背后的原理并不会花太多时间,又不是让你去手写编译器
rabbbit
211 天前
追求极致的理解?看这个🐶
https://tc39.es/ecma262/#sec-async-function-definitions
rabbbit
211 天前
rabbbit
211 天前
开个玩笑,个人觉得知道用法、常见的坑就可以了。
再往上如果能懂得原理,自己实现更好,当然没必要强求,找工作另算还是直接背八股更快。

这是我以前“研究”奇怪语法背后的原因时写的,现在一看,纯吃饱了撑的。
https://aaron-bird.github.io/article/FunctionDeclarationInstantiation/
orioleq
211 天前
@kneo 身为前 1%的程序员,对中位数的程序员说找水找错地方了,听上去还真的不像“嘲讽”…就好像学霸觉得自己的学习经验没啥好分享的都是直觉潜意识,还总劝普娃别走学习这条路了。有些人一边劝经验丰富的程序员安心写代码别瞎寻思转行,一边劝经验没那么丰富的程序员早点转行,多少有点二极管思维吧?
NessajCN
211 天前
这东西多写写就懂了。
编程的好多概念都是看的时候一头雾水,
写到需要用到这些个工具的时候立刻恍然大悟了。
DOLLOR
211 天前
我觉得只有经历过 callback hell 时代,才能理解为什么会有 promise ,为什么会有 async/await 。
所以建议楼主先写一段时间 callback ,自然会慢慢理解了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1035698

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX