在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