码迷,mamicode.com
首页 > 其他好文 > 详细

异步工作流控制-condCall

时间:2017-05-11 18:36:25      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:回调   als   状态   流控   问题   step   lang   方式   ==   

在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

异步工作流控制-condCall

标签:回调   als   状态   流控   问题   step   lang   方式   ==   

原文地址:http://www.cnblogs.com/zhuxianguo/p/6841950.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!