1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-29 05:42:20 +00:00

修改generator

This commit is contained in:
Ruan Yifeng 2015-01-25 14:24:20 +08:00
parent 93a5cdd882
commit 4f7f2ea8eb
3 changed files with 97 additions and 1 deletions

View File

@ -108,7 +108,7 @@ a // "a"
``` ```
事实上只要某种数据结构具有Iterator接口都可以采用数组形式的构赋值。 事实上只要某种数据结构具有Iterator接口都可以采用数组形式的构赋值。
## 对象的解构赋值 ## 对象的解构赋值

View File

@ -74,6 +74,59 @@ setTimeout(function () {
上面代码中函数f如果是普通函数在为变量generator赋值时就会执行。但是函数f是一个Generator函数就变成只有调用next方法时函数f才会执行。 上面代码中函数f如果是普通函数在为变量generator赋值时就会执行。但是函数f是一个Generator函数就变成只有调用next方法时函数f才会执行。
另外需要注意yield语句不能用在普通函数中否则会报错。
```javascript
(function (){
yield 1;
})()
// SyntaxError: Unexpected number
```
上面代码在一个普通函数中使用yield语句结果产生一个句法错误。
下面是另外一个例子。
```javascript
var arr = [1, [[2, 3], 4], [5, 6]];
var flat = function* (a){
a.forEach(function(item){
if (typeof item !== 'number'){
yield* flat(item);
} else {
yield item;
}
}
};
for (var f of flat(arr)){
console.log(f);
}
```
上面代码也会产生句法错误因为forEach方法的参数是一个普通函数但是在里面使用了yield语句。一种修改方法是改用for循环。
```javascript
var flat = function* (a){
var length = a.length;
for(var i =0;i<length;i++){
var item = a[i];
if (typeof item !== 'number'){
yield* flat(item);
} else {
yield item;
}
}
};
```
### next方法的参数 ### next方法的参数
yield语句本身没有返回值或者说总是返回undefined。next方法可以带一个参数该参数就会被当作上一个yield语句的返回值。 yield语句本身没有返回值或者说总是返回undefined。next方法可以带一个参数该参数就会被当作上一个yield语句的返回值。

View File

@ -246,6 +246,49 @@ p.then(null, function (s){
上面代码生成一个Promise对象的实例p状态为rejected回调函数会立即执行。 上面代码生成一个Promise对象的实例p状态为rejected回调函数会立即执行。
## Generator函数与Promise的结合
使用Generator函数管理流程遇到异步操作的时候通常返回一个Promise对象。
```javascript
function getFoo () {
return new Promise(function (resolve, reject){
resolve('foo');
});
}
var g = function* () {
try {
var foo = yield getFoo();
console.log(foo);
} catch (e) {
console.log(e);
}
};
function run (generator) {
var it = generator();
function go(result) {
if (result.done) return result.value;
return result.value.then(function (value) {
return go(it.next(value));
}, function (error) {
return go(it.throw(value));
});
}
go(it.next());
}
run(g);
```
上面代码的Generator函数g之中有一个异步操作getFoo它返回的就是一个Promise对象。函数run用来处理这个Promise对象并调用下一个next方法。
## async函数 ## async函数
async函数是用来取代回调函数的另一种方法。 async函数是用来取代回调函数的另一种方法。