mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-24 10:22:23 +00:00
修改generator
This commit is contained in:
parent
ace860f263
commit
ed7deeb70c
@ -305,6 +305,86 @@ for (n of fibonacci()) {
|
||||
|
||||
从上面代码可见,使用for...of语句时不需要使用next方法。
|
||||
|
||||
## throw方法
|
||||
|
||||
Generator函数还有一个特点,它可以在函数体外抛出错误,然后在函数体内捕获。
|
||||
|
||||
```javascript
|
||||
|
||||
var g = function* () {
|
||||
while (true) {
|
||||
try {
|
||||
yield;
|
||||
} catch (e) {
|
||||
if (e != 'a') {
|
||||
throw e;
|
||||
}
|
||||
console.log('内部捕获', e);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var i = g();
|
||||
i.next();
|
||||
|
||||
try {
|
||||
i.throw('a');
|
||||
i.throw('b');
|
||||
} catch (e) {
|
||||
console.log('外部捕获', e);
|
||||
}
|
||||
// 内部捕获 a
|
||||
// 外部捕获 b
|
||||
|
||||
```
|
||||
|
||||
上面代码中,遍历器i连续抛出两个错误。第一个错误被Generator函数体内的catch捕获,然后Generator函数执行完成,于是第二个错误被函数体外的catch捕获。
|
||||
|
||||
这种函数体内捕获错误的机制,大大方便了对错误的处理。如果使用回调函数的写法,想要捕获多个错误,就不得不为每个函数写一个错误处理语句。
|
||||
|
||||
```javascript
|
||||
|
||||
foo('a', function (a) {
|
||||
if (a.error) {
|
||||
throw new Error(a.error);
|
||||
}
|
||||
|
||||
foo('b', function (b) {
|
||||
if (b.error) {
|
||||
throw new Error(b.error);
|
||||
}
|
||||
|
||||
foo('c', function (c) {
|
||||
if (c.error) {
|
||||
throw new Error(c.error);
|
||||
}
|
||||
|
||||
console.log(a, b, c);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
```
|
||||
|
||||
使用Generator函数可以大大简化上面的代码。
|
||||
|
||||
```javascript
|
||||
|
||||
function* g(){
|
||||
try {
|
||||
var a = yield foo('a');
|
||||
var b = yield foo('b');
|
||||
var c = yield foo('c');
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
|
||||
console.log(a, b, c);
|
||||
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
## yield*语句
|
||||
|
||||
如果yield命令后面跟的是一个遍历器,需要在yield命令后面加上星号,表明它返回的是一个遍历器。这被称为yield*语句。
|
||||
|
@ -42,6 +42,7 @@
|
||||
- Axel Rauschmayer, [Iterators and generators in ECMAScript 6](http://www.2ality.com/2013/06/iterators-generators.html): 探讨Iterator和Generator的设计目的
|
||||
- StackOverflow, [ES6 yield : what happens to the arguments of the first call next()?](http://stackoverflow.com/questions/20977379/es6-yield-what-happens-to-the-arguments-of-the-first-call-next): 第一次使用next方法时不能带有参数
|
||||
- Kyle Simpson, [ES6 Generators: Complete Series](http://davidwalsh.name/es6-generators): 由浅入深探讨Generator的系列文章,共四篇
|
||||
- Gajus Kuizinas, [The Definitive Guide to the JavaScript Generators](http://gajus.com/blog/2/the-definetive-guide-to-the-javascript-generators): 对Generator的综合介绍
|
||||
|
||||
## Promise对象
|
||||
|
||||
@ -60,3 +61,4 @@
|
||||
- Paul Miller, [es6-shim](https://github.com/paulmillr/es6-shim): 一个针对老式浏览器,模拟ES6部分功能的垫片库(shim)
|
||||
- army8735, [Javascript Downcast](https://github.com/army8735/jsdc): 国产的ES6到ES5的转码器
|
||||
- esnext, [ES6 Module Transpiler](https://github.com/esnext/es6-module-transpiler):基于node.js的将ES6模块转为ES5代码的命令行工具
|
||||
- Sebastian McKenzie, [6to5](https://github.com/sebmck/6to5): 将ES6转为ES5代码的Node模块,支持source map
|
||||
|
Loading…
x
Reference in New Issue
Block a user