zoukankan      html  css  js  c++  java
  • 使用promise 和 generator来管理工作流

    根据p219的代码改编
    示例代码如下
    function oneStep(value){
        return new Promise(function(resolve, reject){
            resolve('one step,' + value);
        })
    }
    
    let stepGenerator = function* (){
        try{
            for(let i =0; i < 10; ++i){
                let value = yield oneStep(`step${i}`);
                console.log(`step${i} complete, value:${value}`);
            }
        }catch(e){
            console.log('generator e', e);
        }
    }
    
    function run(generator){
        let it = generator();
    
        function go(result){
            console.log('go,', result);
            if(result.done){
                console.log('done');
                return result.value;
            }
    
            return result.value.then(function(value){
                console.log('call go again, then');
                return go(it.next(value));
            }).catch(function (error){
                console.log('call go again, catch');
                return go(it.throw(error))
            });
        }
        console.log('call go first');
        return go(it.next());
    }
    
    let value = run(stepGenerator);
    console.log('value', value);
    oneStep代表一个执行步骤,是异步执行的。
    stepGenerator代表一个流程,内部包含了一系列的步骤
    然后在run函数通过递归的方式执行一个流程,上一步执行完了就执行下一步。
     
    输出结果如下
    call go first
    go, { value: Promise { 'one step,step0' }, done: false }
    value Promise { <pending> }
    call go again, then
    step0 complete, value:one step,step0
    go, { value: Promise { 'one step,step1' }, done: false }
    call go again, then
    step1 complete, value:one step,step1
    go, { value: Promise { 'one step,step2' }, done: false }
    call go again, then
    step2 complete, value:one step,step2
    go, { value: Promise { 'one step,step3' }, done: false }
    call go again, then
    step3 complete, value:one step,step3
    go, { value: Promise { 'one step,step4' }, done: false }
    call go again, then
    step4 complete, value:one step,step4
    go, { value: Promise { 'one step,step5' }, done: false }
    call go again, then
    step5 complete, value:one step,step5
    go, { value: Promise { 'one step,step6' }, done: false }
    call go again, then
    step6 complete, value:one step,step6
    go, { value: Promise { 'one step,step7' }, done: false }
    call go again, then
    step7 complete, value:one step,step7
    go, { value: Promise { 'one step,step8' }, done: false }
    call go again, then
    step8 complete, value:one step,step8
    go, { value: Promise { 'one step,step9' }, done: false }
    call go again, then
    step9 complete, value:one step,step9
    go, { value: undefined, done: true }
    done
     
     
  • 相关阅读:
    Oracle去除重复(某一列的值重复),取最新(日期字段最新)的一条数据
    eclipse中的项目无法添加到tomcat中
    Myeclipse查看当前项目工作空间
    oracle查看表中否存在某字段,数据库是否存在某张表
    Java中Double原样输出,取消科学计数法
    DateTimeField *** received a naive datetime (***) while time zone support is active
    JS 将UTC时间转为本地时间
    Python与Django的时区问题
    在Django / DRF中正确处理日期时间/时区
    django时间的时区问题
  • 原文地址:https://www.cnblogs.com/strinkbug/p/6721761.html
Copyright © 2011-2022 走看看