js 为什么一下子要上马二个语言级异步转同步方案

2015-07-28 11:30:19 +08:00
 love
一个promise+async语句,一个generator,本来要摆脱callback hell是好的,但一下子来俩就有点重复了吧,都不知道要用哪个好了,选择太多也是累。


py3就只有一种,现在v3.4的用generator,v3.5加一个async语法糖,做一件事只用一个方法。
4426 次点击
所在节点    JavaScript
28 条回复
love
2015-07-28 20:37:40 +08:00
@otakustay 我倒是觉得从表意性上generator也说得过去。yield可以看作异步return,和有同步return的函数互补,比生造一个Promise概念上更简单,只是和同步return不同的是表面上返回的是个数据list而不是return的单个数据,但这个差别很小,一点点不完美而已,python这么追求完美的语言还不是用generator来作为异步底层。
jiongxiaobu
2015-07-28 20:58:54 +08:00
两个不是马上出来的 generator是es6里的,很早就有。async是es7里的,最近才有
sodatea
2015-07-28 22:27:45 +08:00
@love 明白了,你是在说有了 generator 后不需要 promise?
这里有段话可以解释 https://www.promisejs.org/generators/
What generators do not do is give us a way of representing the result of an asynchronous operation. For that, we need a promise.
sodatea
2015-07-28 22:33:30 +08:00
@love 我觉得 generator 的语义更倾向于 lazy sequence 吧……用在异步稍微牵强了点,不过这不是重点。
另外 Promise/Future 的概念并不是生造的,很多其他语言也有啊 https://en.m.wikipedia.org/wiki/Futures_and_promises

除了这些,我个人还觉得 Promise 比较有用的一点是它可以很容易地被 polyfill……这在前端很重要。
love
2015-07-28 23:08:37 +08:00
@sodatea 对啊我就是这个意思,yield本身是个很通用的概念,同时包含lazy/异步/数据流语义,用它来作同步化方案也是可行的且不用让大家再学promise了,你看人家python这么做没什么不好的地方,也让大家少点学习负担。当然现在看来js语言本身根本没有想要用generator来做同步化方案而是完全用promise,本来手写promise体验很渣,但加上async语句后和generator方案有一拼了,所以用promise方案也不能说不好。
ysmood
2015-07-28 23:36:27 +08:00
@love 你为啥要说“二个语言级异步转同步方案”呢?这个说法就不对啊,为什么 yield 就被对号入座了呢?这个官方有推荐这种用法吗?ES 的作者们都没这么说。只是有些人比如 TJ, hack 了一下 yield 的一种特性而已,而且被很多一知半解的人宣传的变了味道。

换个说法,我能用 swich case 完成全部的 yield 的功能,那是不是说 switch case 能算第三种 异步语法了呢?很多方法都是能简化异步问题的,哪止一两种,即使是 callback,不谈 js,即使在 C 编程刚流行这个概念的时候也是解决很多棘手的异步问题的,只不过随着时间的推移需求变得更复杂了,人们又开始寻找能解决当下问题的工具而已。

我敢说用不了几年当 async await 被大量使用后,人们能解决更多更复杂问题的时候又会有新的语法被发明出来。不说未来,即使是现在就有很多玩转了 yield async await promise 开始抱怨它们的总总问题了。有兴趣的话,可以去 MDN 订阅个 mailing list 看看业内人士们是如何讨论未来的,最近两天就有几个哥们一直在讨论 async 的各种问题。
magicyu1986
2015-07-29 03:01:31 +08:00
你知道JS这类语言的实质都是——啰嗦。还记得null 跟 undefined 不?

老老实实给个 coroutine 实现不好么,为毛要搞出三个幺蛾子呢。
denghongcai
2015-07-29 11:18:47 +08:00
Generator可以直接使用try catch,哪来的调试坑

爱用Promise就Promise,爱用Generator就Generator,这有什么争得

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

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

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

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

© 2021 V2EX