1. 程式人生 > >ES6 Generator 相關

ES6 Generator 相關

下一步 nbsp num 在哪裏 for 兩個 繼續 con 內部

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 相關