Generator(異步生成器)

/異步編程:Generator(生成器):在異步對象promise以後的*/
//Generator中包括了多種狀態,經過yield進行返回 eg://
function* hello(){編程

yield 'hello';  //狀態一
yield  'world'; //狀態二
return 'ending';//結束狀態

}
/插入一個知識點/
//var test =hello;
// console.log(test().next());//hello
// console.log(test().next());//hello
///???由於test(),每次運行都會取到一個指向起點的指針,再next()都是指向第一個 yield,因此值都是'hello'
//var ho =hello(); ho.next():每次都是用的一個指針在運動,因此能夠遍歷。
/*/
var ho =hello()//該生成器運行返回指向 yield 'hello'的指針對象,沒有開始執行
//2.執行順序:會在yield 前中止執行,經過next來執行
console.log(ho.next())//{value:'hello',done:false}返回一個對象,promise

//表示執行的值,以及是否完成全部的執行任務

console.log(ho.next());//{value:'world',done:false};
console.log(ho.next());//{value:'ending',done:true};//執行到return或者最後一個yield(判斷無值),done就是true
console.log(ho.next());
//3 yield.next()方法傳遞參數:給上一個yield賦值
//通常狀況下 eg:
var step_1,step_2;
function* test_eg(){異步

step_1=yield 'xmj';
step_2=yield '666';
return '!';

}
console.log(step_1);//表示yield最開始都是undefined;
//經過 yield.next(賦值的參數)爲上一個賦值是爲yield xx這個表達式賦值,不能多也不能少
var test_eg =test_eg();
test_eg.next();//最開始step_1上面沒有yield 賦值沒有意義
test_eg.next('這是給上一個yield表達式賦值');
console.log('step_1: '+step_1);//step_1:這是給上一個yield表達式賦值
/yield.next()加入參數的做用:給生成器內部賦值/
function* foo(x) {
var y = 2 * (yield (x + 1));
var z = yield (y / 3);//經過next傳遞參數來改變本次的行爲
return (x + y + z);
}
var a = foo(5);
a.next() // Object{value:6, done:false}
a.next() // Object{value:NaN, done:false}
a.next() // Object{value:NaN, done:true}
var b = foo(5);
b.next() // { value:6, done:false }
b.next(12) // { value:8, done:false }//把12賦值給上一個yield(x+1),因此y=2*yield(x+1)=24
b.next(13) // { value:42, done:true }
/簡單向生成器內部賦值*/
function* dataConsumer() {
console.log('Started');
console.log(1. ${yield});
console.log(2. ${yield});
return 'result';
}異步編程

let genObj = dataConsumer();
genObj.next();// Started
genObj.next('賦值xmj到上一頁yield')// 1. 賦值xmj到上一頁yield
genObj.next('b')// 2. b
/for of 快捷的遍歷方法:取代next()**/
function* foo() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
return 6;
}指針

for (let v of foo()) {//foo()取到一個指針
console.log(v);//1,2,3,4,5 //當這個 of方法遍歷到done:true時會中止,因此不會輸出6
}code

相關文章
相關標籤/搜索