如何正確使用ES6中的Generator函數(shù)
隨著JavaScript的發(fā)展,異步編程變得越來(lái)越重要。在ES6中,引入了一種新的機(jī)制——Generator函數(shù),可以很好地解決這個(gè)問(wèn)題。本文將介紹如何正確使用ES6中的Generator函數(shù),并查看
隨著JavaScript的發(fā)展,異步編程變得越來(lái)越重要。在ES6中,引入了一種新的機(jī)制——Generator函數(shù),可以很好地解決這個(gè)問(wèn)題。本文將介紹如何正確使用ES6中的Generator函數(shù),并查看返回值。
一、定義Generator函數(shù)并調(diào)用
在已打開(kāi)的HBuilder工具中,打開(kāi)一個(gè)js文件,定義一個(gè)Generator函數(shù)showData:
```javascript
function* showData() {
yield '第一條數(shù)據(jù)';
yield '第二條數(shù)據(jù)';
yield '第三條數(shù)據(jù)';
}
```
調(diào)用該函數(shù)并將其賦值給變量a,并進(jìn)行打印:
```javascript
let a showData();
console.log(a);
```
此時(shí)控制臺(tái)會(huì)輸出一個(gè)遍歷器對(duì)象,其內(nèi)部包含了所有yield語(yǔ)句返回的值。
二、調(diào)用next方法獲取返回值
為了獲取Generator函數(shù)返回的值,我們需要使用next()方法。在上述代碼的基礎(chǔ)上,使用console.log()方法打印四次next()方法的返回值:
```javascript
console.log(());
console.log(());
console.log(());
console.log(());
```
可以發(fā)現(xiàn),前三次調(diào)用next()方法時(shí)done屬性都為false,表示還有返回值;而第四次調(diào)用時(shí)done為true,表示已經(jīng)沒(méi)有返回值了。
三、再次打印返回值
此時(shí),我們?cè)俅伪4娌⒋蛴〗Y(jié)果,發(fā)現(xiàn)前三次done屬性仍然為false,而value屬性分別是'第一條數(shù)據(jù)'、'第二條數(shù)據(jù)'和'第三條數(shù)據(jù)'。但是第四次調(diào)用時(shí),done為true,而value為undefined。
四、注意事項(xiàng)
在使用Generator函數(shù)時(shí),需要注意以下幾點(diǎn):
1. 每次調(diào)用next()方法時(shí),如果已經(jīng)到達(dá)最后一個(gè)return語(yǔ)句,done屬性會(huì)被設(shè)置為true,并且value的值為undefined。
2. 在遍歷生成器時(shí),如果沒(méi)有return語(yǔ)句,則默認(rèn)返回undefined。
3. 如果一個(gè)生成器函數(shù)調(diào)用了自身,或者調(diào)用了其他生成器函數(shù),那么它們都必須在內(nèi)部調(diào)用yield語(yǔ)句,否則會(huì)導(dǎo)致程序死鎖。
結(jié)語(yǔ)
Generator函數(shù)是一種非常強(qiáng)大的異步編程機(jī)制,在正確使用的情況下,可以幫助我們更好地解決異步編程過(guò)程中的問(wèn)題。通過(guò)本文的介紹,相信讀者已經(jīng)能夠初步了解如何正確使用Generator函數(shù),并查看其返回值。