异步工作流控制-condCall

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

此方案描述如下:

1.创建一个依赖状态state

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

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

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

函数实现如下:

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

注:_为lodash库函数

我们测试一下此函数应用

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

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

输出:

first

second

third

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

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

输出:

first

second

third

时间: 2024-10-05 17:44:45

异步工作流控制-condCall的相关文章

WM_PAINT消息在窗口重绘的时候产生,那什么时候窗口会重绘(异步工作方式,效率更高,灵活性更强)

Q:wm_paint消息在窗口重绘的时候产生,那什么时候窗口会重绘?? A: 严格地说,只有当收到WM_PAINT消息后窗口会重绘 但是引起这个消息的事件有很多, 比如: 首次创建 移动 改变大小 showwindow/ activate window/ invalidate window .... 系统为什么不在调用Invalidate时发送WM_PAINT消息呢?又为什么非要等应用消息队列为空时才发送WM_PAINT消息呢?这是因为系统把在窗口中的绘制操作当作一种低优先级的操作,于是尽可能地

流控制、FlowControl

这个选项基本上所有网卡都会有,但是叫法会有些差别,比如Realtek网卡叫做流控制,Intel网卡叫做流程控制,还有一些网卡选项干脆是英文的,叫做FlowControl,很多交换机上也有这个功能,也叫做FlowControl. 网卡自身支持的流控制和我们所说的Qos不一样,虽然目的可能是一样的.作用就是防止网络拥堵时导致的“丢包”问题,大致的工作原理就是当链路两端的设备有一端忙不过来了,他会给另外一端的设备发一个暂停发包的命令,通过这种方式来缓解压力,解决丢包问题. 看上去流控制应该是个非常好的

tcp协议头窗口,滑动窗口,流控制,拥塞控制关系

参考文章 TCP 的那些事儿(下) http://coolshell.cn/articles/11609.html tcp/ip详解--拥塞控制 & 慢启动 快恢复 拥塞避免 http://blog.csdn.net/kinger0/article/details/48206999 TCP window Full http://blog.csdn.net/abccheng/article/details/50503457 名词解释 MTU:maximum transmission unit,最大

什么叫硬件流控制

串口通讯流控制 我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解一点这方面的知识是有好处的.那么,流控制在串行通讯中有何作用,在编制串行通讯程序怎样应用呢?这里我们就来谈谈这个问题. 1.流控制在串行通讯中的作用 这里讲到的“流”,当然指的是数据流.数据在两个串口之间传输时,常常会出现丢失数据的现象,或者两台计算机的处理速度不同,如台式机与单片机之间的通讯,接收端数据缓冲区已

UART硬件流控制信号的使用(图)DTR 【转】

UART硬件流控制信号的使用(图) 转自:http://blog.163.com/zy_tommy/blog/static/86926777201321925451164/ 2013-03-19 14:54:51|  分类: 电子 通信 汽车 |  标签:接口  |举报|字号 订阅 DTR – 数据终端就绪 Data Terminal Ready   低有效   当为低时,表示本设备自身准备就绪. 此信号输出给对端设备,使对端设备决定能否与本设备通信 DSR – 数据装置就绪 Data Set

Android属性动画:动画流控制

今天的文章里,我将会和大家讨论对动画流的控制.我们可以通过Animator系列的API来控制动画的开始.停止和取消.在 KitKat也就是API level 19中,我们还可以控制动画的暂停和恢复.在本文中,我将会带你体验整个动画流的控制,并且通过一些函数方法来让你能够观察到动画的状态. 动画流介绍 在之前的教程中,我们已经使用过多次Animator.start这个方法.这个方法是用来让动画从第一帧开始播放.该方法只是动画流控制方法集中的一个方法而已,完整的方法集合如下所示: Java ; ht

串口流控制

参考文章:http://blog.csdn.net/skyflying2012/article/details/7945022 我们在串行通讯处理中,常常看到rts/cts和xon/xoff这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通rs232编程,了解一点这方面的知识是有好处的.那么,流控制在串行通讯中有何作用,在编制串行通讯程序怎样应用呢?这里我们就来谈谈这个问题. 1.流控制在串行通讯中的作用这里讲到的“流”,当然指的是数据流.数据在两个串口之间

(030) Linux之流控制case分支

十年运维系列之基础篇 - Linux 作者:曾林 联系:[email protected] 网站:www.jplatformx.com 版权:文章未经同意请勿转载 一.引言 本章节将继续讲解流控制的内容.在上面讲解if控制流分支中,我们构建了一个简单的菜单,并建立了用于响应用户选择的逻辑.为达到这个目的,我们使用了一系列的if命令来确定哪个是选中项.这种类型的程序构造经常会被使用到,所以许多编程语言(包括shell)为基于多项选择的判断提供了流控制机制. 二.case命令 bash的多项选择复合

Storm的自适应动态流控制算法

前言 业务的日志ETL拉取框架一直存在很多问题,每次出现故障就导致手忙大乱,因此这次决心要对其进行大改造.这个ETL系统是基于Storm实现的,主要是依靠Spout拉取原始日志,Bolt进行处理再入库,为了提高吞吐量,采用了12个Bolt进行并行处理.旧算法由于没有使用Storm的ack特性,而且还是根据发送Tuple的hash值发送到对应的Bolt中,完全没有考虑好负载均衡问题,在崩溃重启后也需要重新处理当天日志,可用性极低. 新的想法 为了能够达到bolt的负载平衡,想到了采用动态平衡的算法