generator结合Promise使用的例子:
/*Promise函数*/
function getFoo(){
return new Promise(function(resolve,reject){
resolve('foo');
})
}
/*生成器函数*/
var g = function* (){
try{
var foo = yield getFoo();
console.log(foo);
}catch (e){
console.log(e);
}
};
function run(generator){
var it = generator();
function go(result){
if(result.done) {
// console.log(result.value);
return result.value;
}
return result.value.then(function(value){
return go(it.next(value));
},function(error){
return go(it.throw(error));
});
}
go(it.next());
}
run(g);
以上代码等同于:
function getFoo(){
return new Promise(function(resolve,reject){
resolve('foo');
})
}
var g = function* (){
try{
var foo = yield getFoo();
console.log(foo);
}catch (e){
console.log(e);
}
};
let it = g();
it.next().value.then(function (value) {
console.log('i am a promise resolve function,param is :' + value);
// 第二个next()如果在外部执行,则会先执行出console.log(foo);??????????。所以要么在内部执行it.next(value),要么在增加一个then()
// it.next(value);
return value;//返回结果会作为参数,传递给下一个then的参数
}).then(function(value){
it.next(value);
})
最基本的Generator函数
function * g1() {
console.log('before step1');
let y1 = yield 's1';
console.log('before step2');
let y2 = yield 's2';
console.log('before step3');
let y3 = yield 's3';
console.log('y1,y2,y3', y1, y2, y3);
return 'all done';
/*第一个next()将执行,console.log('before step1');yield 's1';*/
/*第二个next()将执行let y1;console.log('before step2');yield 's2';*/
/*第三个next()将执行let y2;console.log('before step3');yield 's3';*/
/*第四个next()将执行let y3;console.log('y1,y2,y3', y1, y2, y3);return 'all done';*/
}
let g = g1();
let r1 = g.next(1);//此时的参数1其实是无效的。
let r2 = g.next(2);//从第二步开始参数才是有效参数。
let r3 = g.next(3);
let r4 = g.next(4);
let r5 = g.next(5);
console.log(r1, r2, r3, r4, r5);
Generator一些概念:
1、yield的返回值,一般是undefine。如果next()中带参数,则参数值是上一个yield的返回值。
2、g.next()的返回值是yield右边表达式的值,yield的值会返回给g.next().value。它是一个object,结构是:{value:XX,done:boolean}
Promise一些概念:
1、Promise.prototype.then()方法中的return值,将作为下一个then()中的参数。