zoukankan      html  css  js  c++  java
  • 异步工作流控制condCall

    在JavaScript编程中,异步操作一直是一个问题,回调是一种深层次的嵌套处理方式,我们也可以把嵌套处理转为直线处理以简化异步处理。有过prolog和erlang编程了解的同学可能对模式匹配有深刻的印象,我们也可以借鉴此种思想处理异步问题-条件执行。

    此方案描述如下:

    1.创建一个依赖状态state

    2.把有异步依赖关系的操作抽象成,条件->执行

    3.当条件不满足时将操作缓存到任务列表

    4.当条件满足时立即执行,并重新执行任务列表中符合条件的操作

    函数实现如下:

    var condCall=function (state) {
        var list = [];
        var fn=function(cond,handle) {
            if (cond(state)) {
                handle(state, function () {
                    _.remove(list, function (o) { return o.cond(state); })
              .forEach(function (o) { fn(o.cond, o.handle) }); }); }
    else { list.push({ cond: cond, handle: handle }); } } return fn; }

    注:_为lodash库函数

    我们测试一下此函数应用

    顺序执行(first,second,third依次执行,3个函数可以以任意顺序排列)

    var f=condCall({step:1});
    f(
        function(state){return state.step==2;},
        function(state,cb){console.log('second');state.step=3;cb();}
    );
    f(
        function(state){return state.step==1;},
        function(state,cb){console.log('first');state.step=2;cb();}
    );
    f(
        function(state){return state.step==3;},
        function(state,cb){console.log('third');cb();}
    );

    输出:

    first

    second

    third

    并行执行(等待fisrt和second执行完后再执行third,3个函数可以以任意顺序排列)

    var f=condCall({first:false,second:false});
    f(
        function(state){return state.first&&state.second;},
        function(state,cb){console.log('third');cb();}
    );
    f(
        function(state){return !state.first;},
        function(state,cb){console.log('first');state.first=true;cb();}
    );
    f(
        function(state){return !state.second;},
        function(state,cb){console.log('second');state.second=true;cb();}
    );

    输出:

    first

    second

    third

  • 相关阅读:
    C#中的控件命名规范
    c# 执行javascript 脚本 并获得变量值 (winform与javascript交互 )
    C# Socket 实现的淘宝秒杀器(抢拍器)
    ASP函数 获取域名解析后的IP 获取远程网页的HTML代码
    C# 使用17方法编写Hello World程序(语法深度)
    框架内数据的打印。。。。
    有点厌恶写程序.....
    漂流的自白
    Asp.net中的页面乱码的问题
    在js 中根据 url 获取其参数
  • 原文地址:https://www.cnblogs.com/zhuxianguo/p/6841950.html
Copyright © 2011-2022 走看看