- 主题:现在你们写 js 还会在发布的时候转成 es5 吗?
所以我最初的问题就是你们现在会改这个参数吗?
而且有些新特性也不是改个参数就能用的,比如 Map:
let old = {};
let nevv = new Map();
for (let prop of old) {} // 报错
for (let [k,v] of nevv) {} // ok
这些这么好用的,你们用不?
【 在 HatsuneMiku (初音ミク) 的大作中提到: 】
: 现在正经写点前端项目都是直接上三大框架(vue,react,angular),这些框架自带脚手架,要不要转成 ES5 只需要一个参数。
: 一般不用特别考虑这些问题了
--
FROM 110.85.22.*
你要关注后面的 console.debug(state) 这个语句,这里代表着某个函数使用了 state 变量。subscribe 只是修改了 state 的值,使用 state 的一般会在其它地方。
那么问题就来了,因为回调没法给上层 scope 添加新变量。所以要么在上层 scope 事先定义这个变量,要么扩大 state 变量的生命周期。这就是回调函数和 async/await 最重大的区别。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 不不, 一般程序员会在subscribe里处理state
: await $wait('click', 'button-ok');
: let state = '';
: ...................
--
FROM 110.85.22.*
async/await 能做到一次性杀掉嵌套的异步任务。
$spawn(async () => {
let r1 = await http.get(url1);
await $msleep(1000);
let r2 = await http.get(url2, r1.data);
}).timeout(2000);
上面这种写法,不管程序执行到哪个位置都可以杀掉。
转成异步怎么写?只能让 http.get() 这些 promise 托管给框架,不好杀啊。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 这都不是啥特别的啊....
: 你说的这种方法, 一些promise库本身也带了类似功能, 比如bluebird也提供了类似cancel的支持.
: 你举的例子里, 如果有内嵌的异步任务, 它的取消就不好做了, 除非破坏性的封装一些东西进去, 但这样对已有的库兼容性就差了
: ...................
--
FROM 110.85.22.*
async/await 底层当然用 promise,这我知道。。但那是 babel 的脏活,跟程序员没关系。里面当然维护一个 context, 但程序员看不到。搭配 const/let/var 语义清晰很多。总之呢,async/await 是 js 的新语法,你们不要太排斥啊。
如果想要实现同样的功能,这个维护 context 的工作就得让程序员自己来做了。
state 变量只是一个例子,不要深究它的使用场景。上面的演示应该足够让你清楚回调函数与 await 的区别了吧。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 这是两种解决问题的方式, 非要用全局的scope, 在流式处理中实现, 肯定也可以, 无非是把context显式传递, 或者通过闭包传递上下文.
: async await翻译成es5的代码基本就是刚才的promise写法, 本身语义上是一致的, 在await/async 之后创建的变量实际上并不是产生在上一层的context里, 而是在await/async 又产生了一个新的context, 后面的所有代码都在新的context中
: 而且你这个state如果要想全局用, 肯定是要在前面声明的, 如果是在后面用, 那就是在新的context中使用, 并不是全局的.
: ...................
--
FROM 110.85.22.*
我知道现在的 async/await 没有实现。。不过我能搞定不用太操心。所以我才说要搞一个新的 coroutine 库出来嘛。想问问有没有同类型的,值不值得我花费两三个周末的时间。
unsubscribe() 只是看不见看不见不存在不存在,实际后台的 ajax 请求还在接收数据。如果是比较大一点的文件,多占带宽啊。正确的姿势其实应该调用 XMLHttpRequest.abort() 中断请求才对。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: async await根本就没有任务的取消一说啊
: 如果你是说的rxjs, unsubscribe()就搞定了
: 如果这是你的coroutine框架要实现的功能, 怎么兼容现有的promise库并实现cancel呢.
: ...................
--
FROM 110.85.22.*
这种函数式编程确实不太懂,,我还想问一下,这个 timeout 能 cancel http.get(url1) 是肯定的,也能 cancel http.get(url2, r1.data) 吗?
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 这段代码, 翻译成rxjs应该类似于
: http.get(url1)
: .pipe(tap(() => sleep(1000)),
: ...................
--
FROM 110.85.22.*
我的想法是有了 async/await 以后,这些 rxjs/saga 等等使用 promise 的库全都可以休了!
只是现在 js 社区显然还没有做好准备。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: async await有啥要排斥的... 我们都用多少年了...
: 但现在我们大多都转向了要么是saga, 要么是rxjs, 不过在一些小的项目上倒是直接用了async/await多一些
--
FROM 110.85.22.*
关于 unsubscribe 同时取消 http 请求这个事情你要不要再确定一下。我之前看过的文档没说过这个。似乎要通过特别的处理才能搞定。
而且 subscribe 可能被调用多次,有多个观察者。处理起来恐怕没有那么简单。哪有一个简单的 .kill() 方便啊。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: rxjs本身都处理了, 基于rxjs的http库 这种http请求的取消是基本功能啊.... 真心没啥特别的0,0
: 包括saga, 在saga被取消时cancel相应的请求都是基本姿势.
: 只有async await原生不支持, 实现又麻烦, 所以搞的人才少,
: ...................
--
FROM 110.85.22.*
用 js,兼容性从来不是问题。
而且这个本来就是抛弃 promise,使用最新的特性,其实没啥兼容性负担。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 这个不现实, 这样的话会break兼容性,
: js里的新feature基本上都可以在不修改旧语言的基础上通过添加语法糖实现
: 我的想法是有了 async/await 以后,这些 rxjs/saga 等等使用 promise 的库全都可以休了!
: ...................
--
FROM 110.85.22.*
没有的啊。。我记得 babel-polyfill 有很多地方是没有实现的。不知道是 Map 还是 Proxy..
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 一般用webpack babel工具栈, 新特性都可以用啊
--
FROM 110.85.22.*