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

edit generator

This commit is contained in:
Ruan Yifeng 2015-06-04 14:17:18 +08:00
parent 1352e36b18
commit 9638862076
2 changed files with 59 additions and 8 deletions

19
docs/async.md Normal file
View File

@ -0,0 +1,19 @@
# 异步操作
## co函数库
如果并发执行异步操作可以将异步操作都放入一个数组跟在yield语句后面。
```javascript
co(function* () {
var values = [n1, n2, n3];
yield values.map(somethingAsync);
});
function* somethingAsync(x) {
// do something async
return y
}
```
上面的代码允许并发三个somethingAsync异步操作等到它们全部完成才会进行下一步。

View File

@ -520,7 +520,39 @@ for(let value of delegatingIterator) {
上面代码中delegatingIterator是代理者delegatedIterator是被代理者。由于`yield* delegatedIterator`语句得到的值是一个遍历器所以要用星号表示。运行结果就是使用一个遍历器遍历了多个Genertor函数有递归的效果。 上面代码中delegatingIterator是代理者delegatedIterator是被代理者。由于`yield* delegatedIterator`语句得到的值是一个遍历器所以要用星号表示。运行结果就是使用一个遍历器遍历了多个Genertor函数有递归的效果。
如果`yield*`后面跟着一个数组,就表示该数组会返回一个遍历器,因此就会遍历数组成员。 再来看一个对比的例子。
```javascript
function* inner() {
yield 'hello!'
}
function* outer1() {
yield 'open'
yield inner()
yield 'close'
}
var gen = outer1()
gen.next() // -> 'open'
gen.next() // -> a generator
gen.next() // -> 'close'
function* outer2() {
yield 'open'
yield* inner()
yield 'close'
}
var gen = outer2()
gen.next() // -> 'open'
gen.next() // -> 'hello!'
gen.next() // -> 'close'
```
上面例子中outer2使用了`yield*`outer1没使用。结果就是outer1返回一个遍历器outer2返回该遍历器的内部值。
如果`yield*`后面跟着一个数组,由于数组原生支持遍历器,因此就会遍历数组成员。
```javascript ```javascript
@ -539,16 +571,16 @@ gen().next() // { value:"a", done:false }
```javascript ```javascript
function *foo() { function *foo() {
yield 2; yield 2;
yield 3; yield 3;
return "foo"; return "foo";
} }
function *bar() { function *bar() {
yield 1; yield 1;
var v = yield *foo(); var v = yield *foo();
console.log( "v: " + v ); console.log( "v: " + v );
yield 4; yield 4;
} }
var it = bar(); var it = bar();