Generator Promise代码片段记录及理解

3 篇文章 0 订阅
2 篇文章 0 订阅

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()中的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值