博客 / 詳情

返回

ES6新增語法(六)——Generator函數詳解

上篇文章《ES6新增語法(五)——Promise詳解》我們介紹Promise,Promise一旦執行就無法暫停和取消,所以ES6引入了Generator函數,可以通過yield關鍵字,把函數的執行流程掛起,可以改變執行流程。

什麼是Generator函數?

Generator主要是異步編程,用來封裝異步任務,是一個異步任務的容器,可以讓函數按照我們指定的時候執行或者暫停。

使用語法:

function *name(){

...

yield; //需要暫停的時候加yield

...

yield;

...

}

const p = name();

p.next() //調用函數,執行到第一個yield處停止

p.next() //從上一個yeild開始執行,到下一個yield處為止

Generator與普通函數區別

1> 定義函數的時候比普通函數多了一個 * 號。

2> 調用的時候,普通函數名後加圓括號直接調用,而Generator並不執行,返回的也不是函數運行結果,而是指向內部的狀態的指針對象,必須調用遍歷器對象的next()方法,使得指針移向下一個狀態。每次調用next,指針就會從上一次停下的地方開始執行到下一個yield。

3> 普通函數是無法暫停的,但Generator函數是分段執行的,yield是暫停標記,而next()可以恢復執行。

generator實例如下:

function *show(){
 console.log('1')
 yield;
 console.log('2')
}
const p = show();
p.next(); //執行第一個yield之前內容,打印1
p.next(); //執行yield之後內容,打印2

yield特點
1> 可以傳參數,只能傳一個參數

function *chuancan(){
 console.log('1')
 let a = yield;
 console.log('a',a)//12
}
const gen = chuancan();
gen.next()
gen.next(12)

2> 返回值

function *fanhui(){
 console.log('1');
 yield 55;
 console.log('2');
}
let fh = fanhui()
let res1 = fh.next()
console.log(res1) //{value: 55, done: false}
let res2 = fh.next()
console.log(res2) //{value: undefined, done: true}

generator函數中也可以添加 return

function *show(){
 console.log('1')
 yield 55;
 console.log(2);
 return 89;
}
let gen = show();
let res1 = gen.next();
console.log(res1) //{value: 55, done: false}
let res2 = gen.next();
console.log(res2) //{value: 89, done: true}

return 方法

return 方法返回給定值,並結束遍歷generator函數。

return 方法提供參數時,返回該參數,不提供時,返回undefined。

Generator函數優點

Generator函數是ES6提供的一種異步編程解決方案,解決了兩大問題:

  • 回調地獄
  • 異步流控
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.