上篇文章《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提供的一種異步編程解決方案,解決了兩大問題:
- 回調地獄
- 異步流控