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
     
     
  • 相关阅读:
    插入排序
    python -- 给电视剧重命名
    程序员你为什么迷茫?
    如何把自己打造成技术圈的 papi 酱
    GitHub中国区前100名到底是什么样的人?
    Python+opencv 图像拼接
    VS2015 新Web项目(C#6)出现CS1617错误的解决
    .Net Task<T>的一种比较神奇的卡死情况(Wait/Result卡死, await能得到结果)
    Xamarin Android自学和实践步骤
    跨过几个坑,终于完成了我的第一个Xamarin Android App!
  • 原文地址:https://www.cnblogs.com/strinkbug/p/6721761.html
Copyright © 2011-2022 走看看