ES6 Generator 相關
Generator
含義:一種異步編程解決方案
形式:,Generator 函數是一個普通函數,但是有兩個特征。
一是,function關鍵字與函數名之間有一個星號;
二是,函數體內部使用yield表達式,定義不同的內部狀態
function 後面的星號沒有規定寫在哪裏,所以以下4種方式都是等效的
function* base(){}
function * base(){}
function *base(){}
function*base(){}
function* base() {
yield \‘base1\‘;
yield \‘base2\‘;
yield \‘base3\‘;
return \‘end\‘;
}
調用方式:調用結束後繼續調用返回undefined
let b = base();
console.log(b.next());//{value: \"base1\", done: false}
console.log(b.next());//{value: \"base2\", done: false}
console.log(b.next());//{value: \"base3\", done: false}
console.log(b.next());//{value: \"end\", done: true}
console.log(b.next());//{value: \"undefined\", done: true}
調用方式看起來像斷點調試的形式
yield關鍵字
在函數中,yield類似於暫停操作,即運行到這裏就暫停。
只有當調用next()方法才進行下一步,知道遇到下一個yield。
若未遇到yield則一直運行到最後。直到return結束。
如果沒有return,則最後會返回undefined。
next()方法
function * NumberMath(x) {
let a = 2 * (yield x);
let b = yield (a+10);
return (a+b+x);
}
let num = NumberMath(10);
console.log(num.next());//{value: 10, done: false}
console.log(num.next());//{value: NaN, done: false}
console.log(num.next());//{value: NaN, done: true}
console.log(num.next());//{value: undefined, done: true}
let num = NumberMath(10);
console.log(num.next());//{value: 10, done: false}
console.log(num.next(10));//{value: 30, done: false}
console.log(num.next(10));//{value: 40, done: true}
console.log(num.next());//{value: undefined, done: true}
所以得出結論,next的參數講替代yield表達式。
yield*表達式,用來在一個 Generator 函數裏面執行另一個 Generator 函數
function* foo() {
yield \‘e\‘;
yield \‘l\‘;
yield \‘l\‘;
}
function* bar() {
yield \‘h\‘;
yield *foo();
yield \‘o\‘;
}
for (let v of bar()){
console.log(v);//h e l l o
}
ES6 Generator 相關