mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-29 05:42:20 +00:00
修改generator
This commit is contained in:
parent
93a5cdd882
commit
4f7f2ea8eb
@ -108,7 +108,7 @@ a // "a"
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
事实上,只要某种数据结构具有Iterator接口,都可以采用数组形式的结构赋值。
|
事实上,只要某种数据结构具有Iterator接口,都可以采用数组形式的解构赋值。
|
||||||
|
|
||||||
## 对象的解构赋值
|
## 对象的解构赋值
|
||||||
|
|
||||||
|
@ -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语句的返回值。
|
||||||
|
@ -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函数是用来取代回调函数的另一种方法。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user