mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-24 18:32:22 +00:00
修改generator
This commit is contained in:
parent
ace860f263
commit
ed7deeb70c
@ -305,6 +305,86 @@ for (n of fibonacci()) {
|
|||||||
|
|
||||||
从上面代码可见,使用for...of语句时不需要使用next方法。
|
从上面代码可见,使用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命令后面加上星号,表明它返回的是一个遍历器。这被称为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的设计目的
|
- 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方法时不能带有参数
|
- 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的系列文章,共四篇
|
- 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对象
|
## Promise对象
|
||||||
|
|
||||||
@ -60,3 +61,4 @@
|
|||||||
- Paul Miller, [es6-shim](https://github.com/paulmillr/es6-shim): 一个针对老式浏览器,模拟ES6部分功能的垫片库(shim)
|
- Paul Miller, [es6-shim](https://github.com/paulmillr/es6-shim): 一个针对老式浏览器,模拟ES6部分功能的垫片库(shim)
|
||||||
- army8735, [Javascript Downcast](https://github.com/army8735/jsdc): 国产的ES6到ES5的转码器
|
- 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代码的命令行工具
|
- 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