- 主题:现在你们写 js 还会在发布的时候转成 es5 吗?
这段代码, 翻译成rxjs应该类似于
http.get(url1)
.pipe(tap(() => sleep(1000)),
flatMap(data1 => http.get(url2, data1)))
.timeout(2000)
.subscribe()
【 在 hgoldfish (老鱼) 的大作中提到: 】
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 58.246.6.*
async await有啥要排斥的... 我们都用多少年了...
但现在我们大多都转向了要么是saga, 要么是rxjs, 不过在一些小的项目上倒是直接用了async/await多一些
【 在 hgoldfish (老鱼) 的大作中提到: 】
: async/await 底层当然用 promise,这我知道。。但那是 babel 的脏活,跟程序员没关系。里面当然维护一个 context, 但程序员看不到。搭配 const/let/var 语义清晰很多。总之呢,async/await 是 js 的新语法,你们不要太排斥啊。
: 如果想要实现同样的功能,这个维护 context 的工作就得让程序员自己来做了。
: state 变量只是一个例子,不要深究它的使用场景。上面的演示应该足够让你清楚回调函数与 await 的区别了吧。
: ...................
--
FROM 58.246.6.*
rxjs本身都处理了, 基于rxjs的http库 这种http请求的取消是基本功能啊.... 真心没啥特别的0,0
包括saga, 在saga被取消时cancel相应的请求都是基本姿势.
只有async await原生不支持, 实现又麻烦, 所以搞的人才少,
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 我知道现在的 async/await 没有实现。。不过我能搞定不用太操心。所以我才说要搞一个新的 coroutine 库出来嘛。想问问有没有同类型的,值不值得我花费两三个周末的时间。
: unsubscribe() 只是看不见看不见不存在不存在,实际后台的 ajax 请求还在接收数据。如果是比较大一点的文件,多占带宽啊。正确的姿势其实应该调用 XMLHttpRequest.abort() 中断请求才对。
--
FROM 58.246.6.*
是的, 确定可以
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 这种函数式编程确实不太懂,,我还想问一下,这个 timeout 能 cancel http.get(url1) 是肯定的,也能 cancel http.get(url2, r1.data) 吗?
--
FROM 58.246.6.*
这个不现实, 这样的话会break兼容性,
js里的新feature基本上都可以在不修改旧语言的基础上通过添加语法糖实现
【 在 hgoldfish (老鱼) 的大作中提到: 】
我的想法是有了 async/await 以后,这些 rxjs/saga 等等使用 promise 的库全都可以休了!
只是现在 js 社区显然还没有做好准备。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: async await有啥要排斥的... 我们都用多少年了...
: 但现在我们大多都转向了要么是saga, 要么是rxjs, 不过在一些小的项目上倒是直接用了async/await多一些
--
FROM 58.246.6.*
简单来讲, 肯定是我说的这样
如果你说的是多次subscribe的情况, 简单情况下每一个subscribe产生了一个新的流(即会请求1,2 各一次)
如果想让一个流可以复用, 也有方法, 但我忘了, 应该是类似replaySubject之类的东西. 这些常见的场景rxjs肯定都覆盖了, 建议读一下文档...
而且说实话, 通常来讲多个subscribe才不是常见的用法...
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 关于 unsubscribe 同时取消 http 请求这个事情你要不要再确定一下。我之前看过的文档没说过这个。似乎要通过特别的处理才能搞定。
: 而且 subscribe 可能被调用多次,有多个观察者。处理起来恐怕没有那么简单。哪有一个简单的 .kill() 方便啊。
--
FROM 58.246.6.*
支持cancel本身就break了现有async await的语义, 除非再加一个cancelable async await...
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 用 js,兼容性从来不是问题。
: 而且这个本来就是抛弃 promise,使用最新的特性,其实没啥兼容性负担。
--
FROM 58.246.6.*
你应该没看过rxjs/saga 吧…… 这个事情还真没抛异常这么简单;-)
【 在 hgoldfish 的大作中提到: 】
:
: 不需要的。。抛异常就行了。
:
: --
: 灭绝人性啊
发自「今日水木 on iPhone X」
--
FROM 114.87.140.*
可以先看下rxjs/saga的简介,本身这些问题是已经被解决的不错的问题了……
【 在 hgoldfish 的大作中提到: 】
:
: 也没你想的那么复杂啊。我之前实现过另外一个协程库的。
:
: --
: 灭绝人性啊
:
:
发自「今日水木 on iPhone X」
--
FROM 114.87.140.*
比如, 下面这段saga代码, 你的协程库准备咋个支持法
function* task1() {
yield delay(1000);
console.log('hello task1');
}
function* task2() {
yield delay(2000);
console.log('hello task2');
}
function* task3() {
yield delay(3000);
console.log('hello task3');
}
function* task() {
yield spawn([task1, task2, task3]);
console.log('hello task');
}
function* uiHandler() {
let task = yield fork(task);
let input = yield take('user-input');
if (input == '1') {
yield cancel(task);
}
}
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 之前我已经看过 rxjs 了,但我不喜欢这种风格的编程方式。
: 上面的讨论已经讲了很多 js 函数式编程的缺陷。最大的缺陷没说,函数式编程晦涩难懂,回调又回调,跟 goto 差不多。
: 奇怪 js 连尾递归、纯函数都没正经地支持,搞函数式编程是几个意思。
: ...................
--
修改:pangwa FROM 101.85.232.*
FROM 101.85.232.*