es6的generator

es6-vs-js

对于nodejs我是很早再看,然后挺不感冒的,不过现在由于nodejs的出现,前端人可以用js确实做的要比原先更多。不过,对于web后端的影响,我觉得目前还是很甚微的,不过自己搞搞玩,免得再学另一门语言,这个还是很不错的。express是当时唯一可选的,现在koa明显也确定了成为下一代nodejs框架的地位,不过1和2了很大不同。这段时间,突然想看看koa是什么,但是。。。。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
app.use(function *() {
this.body = 'hello world!';
});
// koa2
app.use(co.wrap(function *(ctx, next) {
const start = new Date();
yield next();
const ms = new Date() - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
}));
app.use(async (ctx, next) => {
const start = new Date();
await next();
const ms = new Date() - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});

这都是啥对啥–T_T!

终于耐着性子找了点资料看看了,哦,这是es6里的一些新内容,于是把一些看到的记录下来。

目前异步操作的编程方法,大概有下面四种:

  • 回调函数
  • 事件监听
  • 发布/订阅
  • Promise对象

其中,我觉得事件监听和发布/订阅是可以归为一类。对于回调函数,其他要是没有很熟练的掌握,要不就是了解有限。就在这样的情况下,es6给我们带来了新的异步编程方法。

  • Generator函数的含义与用法
  • Thunk函数的含义与用法
  • co函数库的含义与用法
  • async函数的含义与用法

这些就会解答,上面的那些都是啥,感觉在不看就要落伍了!!!

这次先学习下Generator,剩下的以后再慢慢来。

Generator很像一个函数,但是你可以暂停它的执行。你可以向它请求另一个值,于是它给你提供另一个值,余下的却不是自动给你,直到你请求为止。

Generator在ES6中的声明更像函数,除了有个*。如果你想让你的Generator提供值并暂停,就用yield。比如:

1
2
3
4
5
6
7
8
9
10
function* idMark() {
var i = 0;
while(i < 5) {
var reset = yield i++;
if(i > 10) {
i = -1;
}
}
}

这就是定义了一个Generator,如果你想用的话,如果你执行idMark()的话,发现什么也不会有。实际,调用Generator后会返回一个迭代器对象,如果你要调用,得使用这个next方法。

1
2
3
4
5
6
var gen = idMark();
console.log(gen.next()); // {value: 0, done: false}
...
console.log(gen.next()); // {value: 4, done: false}
console.log(gen.next()); // {value: undefined, done: true}

如果,你在next中传参就会直接作为结果返回。

1
2
3
4
5
6
var gen = idMark();
console.log(gen.next(2)); // {value: 2, done: false}
...
console.log(gen.next()); // {value: 4, done: false}
console.log(gen.next()); // {value: undefined, done: true}