- 主题:现在你们写 js 还会在发布的时候转成 es5 吗?
不需要的。。抛异常就行了。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 支持cancel本身就break了现有async await的语义, 除非再加一个cancelable async await...
--
FROM 110.85.22.*
也没你想的那么复杂啊。我之前实现过另外一个协程库的。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 你应该没看过rxjs/saga 吧…… 这个事情还真没抛异常这么简单;-)
: 发自「今日水木 on iPhone X」
--
FROM 110.85.22.*
之前我已经看过 rxjs 了,但我不喜欢这种风格的编程方式。
上面的讨论已经讲了很多 js 函数式编程的缺陷。最大的缺陷没说,函数式编程晦涩难懂,回调又回调,跟 goto 差不多。
奇怪 js 连尾递归、纯函数都没正经地支持,搞函数式编程是几个意思。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 可以先看下rxjs/saga的简介,本身这些问题是已经被解决的不错的问题了……
: 发自「今日水木 on iPhone X」
--
FROM 110.85.22.*
在 get(1) 和 storage.get(a) 里面由协程库抛出一个特殊的异常。在最外层捕获并丢弃。所以需要一个 $spawn() 这样的函数,用于管理协程。
【 在 shaolin (我的大小宝贝儿...) 的大作中提到: 】
: 多个异步这种kill不好做吧
: let a = await http.get(1);
: let b = await storage.get(a);
: ...................
--
FROM 110.85.22.*
一样的写法啊。。async function 其实就是 function *,yield 相当于 await. 字对字直接替换你上面那段代码就是我打算做的协程库。
但 yield 和 await 有些隐秘的区别。所以以前用 generator 搞协程会有一些问题。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 比如, 下面这段saga代码, 你的协程库准备咋个支持法
: function* task1() {
: yield delay(1000);
: ...................
--
FROM 110.85.22.*
大哥,我不是新手。。不用向我解释那么多。我问的是 babel 编译的 target,大家还会不会选择对 es6 支持不好的 ie11/edge 以及早期版本的 chrome (有些 winxp 机器还在用旧版的 chrome, 因为新版的不再支持 32 位,也不再支持 winxp 了),毕竟选择支持越多的浏览器,生成的目标代码也就越大。
不单是 js, 还有 css. 我想问的是,大家是不是不再支持 ie/old edge/firefox 了。我最近看到好些网站不支持我用的 firefox 了,显示会错乱。。
【 在 eGust (十年) 的大作中提到: 】
: js 世界里有几种工具,一种是 transpiler,比如 babel.js,可以把翻译许多新语法翻译成老语法。另外一种是 polifill,现在最流行的应该是 corejs,就是给不支持新语法的浏览器尽量打补丁,但是有些是补不出来的,比如 Proxy。还有一个工具是 browserslist,它的作用是给
: 虽然也可以完全自己从头搭,但是这年头随便找个 boilerplate、create-xxx-app 之类的前端库,要么带个 .browserslistrc 文件,要么直接放在 package.json 里面,你只要填想支持什么浏览器就可以了,根本不是需要额外操心的
--
FROM 110.85.22.*
还没开始做啊。我最近又开始写 js,离开 js 社区两年了,所以想问一下最近有没有新的程序库做得好一些。如果有,我就不用做了,省事。
至于怎么 cancel,这是实现的细节。光鲜的 API 底下都是龌龊的实现。只要知道上层是通过异常判断协程被杀死就行了。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 可以给个demo么, 比如怎么cancel... 基于现有语言特性, 感觉用async/await实现不出来啊..
: 一样的写法啊。。async function 其实就是 function *,yield 相当于 await. 字对字直接替换你上面那段代码就是我打算做的协程库。
: 但 yield 和 await 有些隐秘的区别。所以以前用 generator 搞协程会有一些问题。
: ...................
--
FROM 110.85.22.*
generator 就是 coroutine. 以下是一段使用 coroutine 实现 generator 的代码:
async generator(result) {
for (int i = 0; i < 10; ++i) {
result.set(i);
}
result.set(null);
}
async caller() {
let result = new Event();
generator(result);
while (true) {
let i = await result.wait();
result.clear();
if (i === null) {
break;
}
console.debug(result);
}
}
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 现有的promise也有些支持cancel啊,不过大多都是半残(因为要做好必须成体系的支持),至于promise和async await没必要区分,本来就能混用
: 对了 你说用generator实现协程的问题能简单说下吗?
: 发自「今日水木 on iPhone X」
: ...................
--
修改:hgoldfish FROM 110.85.22.*
FROM 110.85.22.*
这里用到一个特殊的类型 Event,它的代码是这样:
class Event {
constructor() {
this.flag = false;
this.value = null;
this.waiters = [];
}
isSet() {
return this.flag;
}
set(value) {
this.value = value;
if (!this.flag) {
this.flag = true;
while (this.waiters.length > 0) {
let waiter = this.waiters.shift();
waiter.resolve(value);
}
}
}
clear() {
this.flag = false;
this.value = null;
}
async wait() {
if (this.flag) {
return this.value;
}
let waiter = {};
let promise = new Promise((resolve, _) => {
waiter["resolve"] = resolve;
});
this.waiters.push(waiter);
return await promise;
}
}
【 在 hgoldfish (老鱼) 的大作中提到: 】
: generator 就是 coroutine. 以下是一段使用 coroutine 实现 generator 的代码:
: async generator(result) {
: for (int i = 0; i < 10; ++i) {
: ...................
--
FROM 110.85.22.*
这里利用了 promise,但是跟 promise 是不一样的。你再仔细看看。
这个 Event 很好用。你可以认为它是一个协程间的消息队列,类似于 go 的 channel. 可以用于两个协程之间通信。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 感觉就是轮了一个promise啊....
: 这里用到一个特殊的类型 Event,它的代码是这样:
: class Event {
: ...................
--
FROM 110.85.22.*