- 主题:现在你们写 js 还会在发布的时候转成 es5 吗?
现在正经写点前端项目都是直接上三大框架(vue,react,angular),这些框架自带脚手架,要不要转成 ES5 只需要一个参数。
一般不用特别考虑这些问题了
【 在 hgoldfish 的大作中提到: 】
: 你们现在是不是已经彻底不支持 chrome 以外的浏览器了?
--
FROM 124.64.19.*
这都不是啥特别的啊....
你说的这种方法, 一些promise库本身也带了类似功能, 比如bluebird也提供了类似cancel的支持.
你举的例子里, 如果有内嵌的异步任务, 它的取消就不好做了, 除非破坏性的封装一些东西进去, 但这样对已有的库兼容性就差了
而且你的例子多少一些类似saga的感觉, 建议你去看下redux-saga...
【 在 hgoldfish (老鱼) 的大作中提到: 】
不用自己的语法啊。。我打算这么搞:
// 请求后端并设置超时。
let c = $spawn(async () => {
let resp = await http.get(url, query);
console.debug(resp.json);
});
setTimeout(1000, c.kill);
// 向后端发起多个请求
let c = $map(async (url) => {
return await http.get(url).json;
}, urls);
console.debug(c.result);
// 等待UI事件
$spawn(async () => {
// 省得写一堆的 event bind.
let button = $wait("click", ["btn-add-user", "btn-query"]);
if (button === "btn-add-user") {
let user = await showUserDialg();
if (user) addUser();
} else if (button == "btn-query") {...}
});
// 等待数据变化
$spawn(async () => {
let [key, value] = $wait(this.data); // 使用 Proxy 监听 this.data
if (key == "username") {
$("lable-username").html(value);
} else if (...) {}
});
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 这个你得实现一套自己的语法了吧, js的异步本身不就和coroutine很像了么, 不太确定你想做成啥样0,0...
--
FROM 58.246.6.*
是语法糖没错,但其实还是有区别的。你看看这段代码:
fromEvent(...).subscribe(() => {
let state = "running";
}));
console.debug(state);
报错。一般这种情况 js 程序员就得通过 this.xxx 来维护状态。或者时髦一点,搞个 State
而 async/await 没有回调以后就没问题:
// do some thing
await $wait("click", "button-ok");
let state = "";
接下来的处理可以继续用这个 state,不用把 state 的作用域扩大到这个函数之外。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 而且async await本身可以理解成promise的语法糖, 没啥特别的啊... async await都和promise兼容, 无非是写法的区别
--
FROM 110.85.22.*
不不, 一般程序员会在subscribe里处理state
await $wait('click', 'button-ok');
let state = '';
这个例子, 前提是你得把它们写在一个async function里面, 本质上就是转化成了
$wait('click', 'button-ok').then(() => {
let state = ...
});
【 在 hgoldfish (老鱼) 的大作中提到: 】
是语法糖没错,但其实还是有区别的。你看看这段代码:
fromEvent(...).subscribe(() => {
let state = "running";
}));
console.debug(state);
报错。一般这种情况 js 程序员就得通过 this.xxx 来维护状态。或者时髦一点,搞个 State
而 async/await 没有回调以后就没问题:
// do some thing
await $wait("click", "button-ok");
let state = "";
接下来的处理可以继续用这个 state,不用把 state 的作用域扩大到这个函数之外。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 而且async await本身可以理解成promise的语法糖, 没啥特别的啊... async await都和promise兼容, 无非是写法的区别
--
FROM 58.246.6.*
一般来讲, 用this来维护状态的是一种流派, 我没咋写过, 基于流的处理方法很少使用this来维护状态
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
不不, 一般程序员会在subscribe里处理state
await $wait('click', 'button-ok');
let state = '';
这个例子, 前提是你得把它们写在一个async function里面, 本质上就是转化成了
$wait('click', 'button-ok').then(() => {
let state = ...
});
【 在 hgoldfish (老鱼) 的大作中提到: 】
是语法糖没错,但其实还是有区别的。你看看这段代码:
fromEvent(...).subscribe(() => {
let state = "running";
}));
console.debug(state);
报错。一般这种情况 js 程序员就得通过 this.xxx 来维护状态。或者时髦一点,搞个 State
而 async/await 没有回调以后就没问题:
// do some thing
await $wait("click", "button-ok");
let state = "";
接下来的处理可以继续用这个 state,不用把 state 的作用域扩大到这个函数之外。
【 在 pangwa (学门手艺,混口饭吃.) 的大作中提到: 】
: 而且async await本身可以理解成promise的语法糖, 没啥特别的啊... async await都和promise兼容, 无非是写法的区别
--
FROM 58.246.6.*
所以我最初的问题就是你们现在会改这个参数吗?
而且有些新特性也不是改个参数就能用的,比如 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.*
一般用webpack babel工具栈, 新特性都可以用啊
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 所以我最初的问题就是你们现在会改这个参数吗?
: 而且有些新特性也不是改个参数就能用的,比如 Map:
: let old = {};
: ...................
--
FROM 58.246.6.*
这是两种解决问题的方式, 非要用全局的scope, 在流式处理中实现, 肯定也可以, 无非是把context显式传递, 或者通过闭包传递上下文.
async await翻译成es5的代码基本就是刚才的promise写法, 本身语义上是一致的, 在await/async 之后创建的变量实际上并不是产生在上一层的context里, 而是在await/async 又产生了一个新的context, 后面的所有代码都在新的context中
而且你这个state如果要想全局用, 肯定是要在前面声明的, 如果是在后面用, 那就是在新的context中使用, 并不是全局的.
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 你要关注后面的 console.debug(state) 这个语句,这里代表着某个函数使用了 state 变量。subscribe 只是修改了 state 的值,使用 state 的一般会在其它地方。
: 那么问题就来了,因为回调没法给上层 scope 添加新变量。所以要么在上层 scope 事先定义这个变量,要么扩大 state 变量的生命周期。这就是回调函数和 async/await 最重大的区别。
--
修改:pangwa FROM 58.246.6.*
FROM 58.246.6.*
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.*