异步工作流控制-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
异步工作流控制-condCall的更多相关文章
- tcp协议头窗口,滑动窗口,流控制,拥塞控制关系
参考文章 TCP 的那些事儿(下) http://coolshell.cn/articles/11609.html tcp/ip详解--拥塞控制 & 慢启动 快恢复 拥塞避免 http://b ...
- 浅析PC机串口通讯流控制
转自浅析PC机串口通讯流控制 我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解 ...
- LED驅動芯片 兩種恒流控制方式
下面要說的是,兩種恒流控制模式的開關電源,從而產生兩種做法.這兩種做法無論是原理,還是器件應用,還是性能差別,相當都較大. 首先說原理.第一種以現在恒流型LED專用IC為代表,主要如9910系 ...
- WM_PAINT消息在窗口重绘的时候产生,那什么时候窗口会重绘(异步工作方式效率高、灵活性强,还有UpdateWindow和RedrawWindow帮忙)
Q:wm_paint消息在窗口重绘的时候产生,那什么时候窗口会重绘?? A: 严格地说,只有当收到WM_PAINT消息后窗口会重绘 但是引起这个消息的事件有很多, 比如:1.首次创建 2.移动 3.改 ...
- shell的case语句简述(shell的流控制)
shell流控制:http://www.cnblogs.com/yunjiaofeifei/archive/2012/06/12/2546208.html 1.if then else 语句 if t ...
- 06-JavaScript的流控制语句
06-JavaScript的流控制语句 JavaScript的流控制语句主要分为三大类: 顺序控制:因为JS是一门解释性语言,所以从上至下按顺序依次执行 分支控制:主要分为if条件语句和swith开关 ...
- 流控制、FlowControl
这个选项基本上所有网卡都会有,但是叫法会有些差别,比如Realtek网卡叫做流控制,Intel网卡叫做流程控制,还有一些网卡选项干脆是英文的,叫做FlowControl,很多交换机上也有这个功能,也叫 ...
- Oozie分布式工作流——流控制
最近又开始捅咕上oozie了,所以回头还是翻译一下oozie的文档.文档里面最重要就属这一章了--工作流定义. 一提到工作流,首先想到的应该是工作流都支持哪些工作依赖关系,比如串式的执行,或者一对多, ...
- C语言流控制命令的总结
C语言流控制命令的总结 基本概念: C语言中,自顶向下的的代码的流程叫做程序流. 能够改变程序流顺序的语句叫做流控制命令. 我为什么要写这篇文章 在学习C语言的过程中,经常会用到条件语句和循环语句这些 ...
随机推荐
- Ubuntu 16.04系统下安装RapidSVN版本控制器及配置diff,editor,merge和exploer工具
在Window下我们使用TortoiseSVN(小乌龟),可以很方便地进行查看.比较.更新.提交.回滚等SVN版本控制操作. 在Linux下我们可以使用RapidSVN.RapidSVN是一款轻量级的 ...
- 《用Python做HTTP接口测试》学习感悟
机缘巧合之下,报名参加了阿奎老师发布在"好班长"的课程<用Python做HTTP接口测试>,报名费:15rmb,不到一杯咖啡钱,目前为止的状态:坚定不移的跟下去,自学+ ...
- session的使用
一.什么是session? Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序的 Web 页之间跳转时, ...
- java安装1335错误解决办法(亲测)
心血来潮想了解一下java,结果一开始就碰到了让心"恶心"的1335错误. 废话不多说,直接看下面: 你可以先尝试在这个链接下载java.exe文件 http://www.orac ...
- vue-miniQQ——基于Vue2实现的仿手机QQ单页面应用(接入了聊天机器人,能够进行正常对话)
使用Vue2进行的仿手机QQ的webapp的制作,作品由个人独立开发,源码中进行了详细的注释. 由于自己也是初学Vue2,所以注释写的不够精简,请见谅. 项目地址 https://github.com ...
- iPhone与iWatch连接、控制、数据传递(Swift)
最近在做一个项目,涉及到iPhone设备和手表传输数据.控制彼此界面跳转,在网上找了很多资料,发现国内的网站这方面介绍的不多,而国外的网站写的也不是很全,所以在这写这篇博客,给大家参考一下,望大神指点 ...
- express创建网站
Express 在初始化一个项目的时候需要指定模板引擎,默认支持Jade和ejs. 这里我们使用ejs模板引擎:(关于ejs的介绍可以先从百科里面了解一个大概)EJS是一个JavaScript模板库, ...
- Yii2高级模板vendor和application非同级目录部署
上面是Yii2的高级模板,当我们有多个application的时候,这种高级模板可以可以提供很好的扩展性,多个application共用一份YII2框架,默认情况下,框架和application是在同 ...
- STM32驱动OV7725摄像头颜色识别
实验目的: 使用stm32驱动OV7725摄像头进行图像实时采集,在tft屏幕上实时显示并识别图像中的特定颜色,在颜色的周围画上框. 实验现象: 我的工程代码链接: http://download.c ...
- windows下修改eclipse的默认编码 转
windows下一般系统编码为 GB2312(中文版的windows), 由于我比较喜欢utf8格式的编码,现将修改方式和大家分享 如果要使新建立工程.java文件直接使UTF-8则需要做以下工作: ...