generator小試牛刀
- generator 簡介
generator:您可以將生成器視為可以暫停和恢復(fù)的進(jìn)程(代碼段),代碼在執(zhí)行的過程中可以主要交出控制權(quán)
genearator 語法:function *是一個新的關(guān)鍵字用于生成器函數(shù)(也有生成器方法)奢浑。
yield是generator可以自行暫停的運算符核蘸。此外,generator還可以通過yield接收輸入和發(fā)送輸出。
function* genFunc() {
// (A)
console.log('First');
yield;
console.log('Second');
}
const genObj = genFunc();
genObj.next();
// Output: First
genObj.next();
// output: Second
1. 當(dāng)您調(diào)用生成器函數(shù)genFunc()時掉弛,您將獲得可用于控制進(jìn)程的生成器對象genObj
此時該生成器對象里面的代碼還沒有執(zhí)行,該進(jìn)程最初在行A中暫停。
2. genObj.next()恢復(fù)執(zhí)行,
3. genFunc()中的yield將暫停執(zhí)行
generator 函數(shù)的不同種類
- generator 函數(shù)
function* genFunc() {
···
}
const genObj = genFunc();
- generator函數(shù)表達(dá)式
const genFunc = function* () {
···
};
const genObj = genFunc();
- 對象中的generator方法
const obj = {
* generatorMethod() {
···
}
};
const genObj = obj.generatorMethod();
- 類中的generator方法
class MyClass {
* generatorMethod() {
···
}
}
const myInst = new MyClass();
const genObj = myInst.generatorMethod();
使用案例
有人問了,這generator有什么用了危喉,generator返回的對象是可迭代的;每個產(chǎn)量都有助于迭代值的序列。
- 使用生成器實現(xiàn)迭代.
function * objectEntries(obj){
const objKeys=Reflect.ownKeys(obj)
for(const objKey of objKeys){
yield [objKey,obj[objKey]]
}
}
const jane = { first: 'Jane', last: 'Doe' };
for (const [key,value] of objectEntries(jane)) {
console.log(`${key}: ${value}`);
}
- 解決異步回調(diào)
您可以使用generator極大地簡化與Promises的工作州疾。我們來看看一個基于Promise的函數(shù)fetchJson()以及如何通過generator進(jìn)行改進(jìn)辜限。