Generator 是es6处置惩罚异步编程的一种体式格局,来看看和promise有什么差别
const myFirstPromise = new Promise((resolve, reject) => {
// resolve(someValue); // fulfilled
// 或
// reject("failure reason"); // rejected
});
myFirstPromise.then(x=>x) //猎取值
再来看看Generator函数 ,函数前面是一个* 然后是函数名, 函数体内里是用yield代表return 然则能够返回屡次
function* gen(){
yield 1
yield 2
return 'return' //运用return 即不处置惩罚背面的yield
}
let b=gen();
console.log(b); //{} 返回的是一个generator对象
console.log(b.next()) //{ value: 1, done: false }
Generator的写法更像是同步的语句,比promise更简约
猎取generator值的几种体式格局
1.挪用能够运用 next()猎取值
console.log(b.next()) //{ value: 1, done: false }
console.log(b.next()) //{ value: 2, done: false }
console.log(b.next()) //{ value: 'return', done: true } done==true示意为末了一步
function* foo(){
yield 'a'
yield 'b'
yield 'c'
}
2.也能够运用for…of 猎取值
let f=foo();
for(let a of f ){
console.log(a,'------')
}
3.Array.from
console.log(Array.from(foo()),'-----from') //[ 'a', 'b', 'c' ] '-----from'
4.扩大运算符
console.log([...foo()]); //[ 'a', 'b', 'c' ]
5.解构赋值
let [x,y]=foo();
console.log(x,'----x') //a
引见下generatr经常使用的一些要领,next,return,throw
1.return 要领
function* bar(a,b){
yield '1'
yield '2'
yield '3'
};
var barG=bar();
console.log(barG.next()) //{ value: 3, done: false }
console.log(barG.return('foo')) //{ value: 'foo', done: true } //return 背面都没有值
console.log(barG.next()) //{ value: undefined, done: true }
2.throw()要领
function* gen() {
try {
console.log('---')
yield ; //由于没有返回值
} catch (e) {
console.log('内部捕捉', e); //走的是这里
}
yield console.log('end');
};
try {
var g = gen();
g.next() //console.log('---')
g.throw('a'); //先走了非常 内部捕捉 a 然则并非yield 所以继承走 打印end
g.throw('b'); //由于这个非常背面已没有yield 所以直接走的挪用的catch 打印的外部捕捉 b
} catch (e) {
console.log('外部捕捉', e);
}
Generatro不是一个组织函数,只是一个遍历对象 所以内里的this都是指向window,下面看看例子
function* gener(){
yield this.name=1;
}
console.log(gener().next()); //{ value: 1, done: false }
console.log(gener().name) //undefined
console.log(window.name) //1
天天提高一点,愿望人人喜好,也愿望喜好的朋侪点个赞,后续继承更新…