From 96388620764de0571c68b5ae31eadf4381ba4202 Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Thu, 4 Jun 2015 14:17:18 +0800 Subject: [PATCH] edit generator --- docs/async.md | 19 +++++++++++++++++++ docs/generator.md | 48 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 docs/async.md diff --git a/docs/async.md b/docs/async.md new file mode 100644 index 0000000..152d696 --- /dev/null +++ b/docs/async.md @@ -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异步操作,等到它们全部完成,才会进行下一步。 diff --git a/docs/generator.md b/docs/generator.md index 2944c0f..0d24d58 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -520,7 +520,39 @@ for(let value of delegatingIterator) { 上面代码中,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 @@ -539,16 +571,16 @@ gen().next() // { value:"a", done:false } ```javascript function *foo() { - yield 2; - yield 3; - return "foo"; + yield 2; + yield 3; + return "foo"; } function *bar() { - yield 1; - var v = yield *foo(); - console.log( "v: " + v ); - yield 4; + yield 1; + var v = yield *foo(); + console.log( "v: " + v ); + yield 4; } var it = bar();