diff --git a/docs/generator.md b/docs/generator.md index 4df9902..4a12b12 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -118,6 +118,25 @@ loader.next() 上面代码表示,第一次调用loadUI函数时,该函数不会执行,仅返回一个遍历器。下一次对该遍历器调用next方法,则会显示Loading界面,并且异步加载数据。再一次使用next方法,则会隐藏Loading界面。可以看到,这种写法的好处是所有Loading界面的逻辑,都被封装在一个函数,按部就班非常清晰。 +下面是另一个例子,通过Generator函数逐行读取文本文件。 + +```javascript + +function *numbers() { + let file = new FileReader("numbers.txt"); + try { + while(!file.eof) { + yield parseInt(file.readLine(), 10); + } + } finally { + file.close(); + } +} + +``` + +上面代码打开文本文件,使用yield语句可以手动逐行读取文件。 + 总结一下,如果某个操作非常耗时,可以把它拆成N步。 ```javascript diff --git a/docs/promise.md b/docs/promise.md index 3995f27..a2d521a 100644 --- a/docs/promise.md +++ b/docs/promise.md @@ -190,7 +190,20 @@ p.then(function (s){ async函数是用来取代回调函数的另一种方法。 -只要函数名之前加上async关键字,就表明该函数内部有异步操作。该异步操作应该返回一个promise对象,前面用await关键字注明。当函数执行的时候,一旦遇到await就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。 +只要函数名之前加上async关键字,就表明该函数内部有异步操作。该异步操作应该返回一个Promise对象,前面用await关键字注明。当函数执行的时候,一旦遇到await就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。 + +```javascript + +async function getStockPrice(symbol, currency) { + let price = await getStockPrice(symbol); + return convert(price, currency); +} + +``` + +上面代码是一个获取股票报价的函数,函数前面的async关键字,表明该函数将返回一个Promise对象。调用该函数时,当遇到await关键字,立即返回它后面的表达式(getStockPrice函数)产生的Promise对象,不再执行函数体内后面的语句。等到getStockPrice完成,再自动回到函数体内,执行剩下的语句。 + +下面是一个更一般性的例子。 ```javascript @@ -205,14 +218,8 @@ async function asyncValue(value) { return value; } -(async function() { - var value = await asyncValue(42); - assert.equal(42, value); - done(); -})(); - ``` -上面代码中,asyncValue函数前面有async关键字,表明函数体内有异步操作。执行的时候,遇到await语句就会先返回,等到timeout函数执行完毕,再返回value。后面的匿名函数前也有async关键字,表明该函数也需要暂停,等到await后面的`asyncValue(42)`得到值以后,再执行后面的语句。 +上面代码中,asyncValue函数前面有async关键字,表明函数体内有异步操作。执行的时候,遇到await语句就会先返回,等到timeout函数执行完毕,再返回value。 async函数并不属于ES6,而是被列入了ES7,但是traceur编译器已经实现了这个功能。 diff --git a/docs/reference.md b/docs/reference.md index 6d2df3a..ce35d95 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -41,6 +41,7 @@ - Jake Archibald, [JavaScript Promises: There and back again](http://www.html5rocks.com/en/tutorials/es6/promises/) - Tilde, [rsvp.js](https://github.com/tildeio/rsvp.js) - Sandeep Panda, [An Overview of JavaScript Promises](http://www.sitepoint.com/overview-javascript-promises/): ES6 Promise入门介绍 +- Jafar Husain, [Async Generators](https://docs.google.com/file/d/0B4PVbLpUIdzoMDR5dWstRllXblU/view?sle=true): 对async与Generator混合使用的一些讨论 ## 工具