mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-24 18:32:22 +00:00
修改promise/async
This commit is contained in:
parent
75b88c3ba5
commit
0a6ad94871
@ -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
|
||||
|
@ -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编译器已经实现了这个功能。
|
||||
|
@ -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混合使用的一些讨论
|
||||
|
||||
## 工具
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user