smartJS 0.1 API 讲解 - FlowController
本篇介绍0.1版中最后一个特性,FlowController;同时也对第一版总结一下,因为近两年全部都是在搞前端,都是做一些js框架类的东西,也做了不少有意思的功能,做smartjs对我来说一个是对自己做一个总结,也希望分享一些东西给大家借鉴。
而对smartjs的来说,整体思想都并不是为了实现什么功能、特效和内容。而是希望体现一些前端编程模式或者思想上的内容,这次的0.1版本中,主要体现了一些面向切面编程、非侵入式编程、异步编程,生命周期控制的一些思想。包括后续的oop的内容,基于策略的数据管理,模型驱动,类型驱动等等都是想给前端开发中注入一些特别点的内容。
FlowController
流程或者生命周期管理器。控制流程的走向,流程扩展,注入控制等等;FlowController是基于trigger封装,具有所有trigger的特性;
接口方法
var flow = {
node1 : function(e,arg,...){}
};
//流程控制初始化
flowController({
flow : flow,
order : ["node1"],
mode : "",
trigger : true | {mode : "",iFace : {}}
})
//启动流程
flow.boot(arg,...);
//根据指定的流程节点启动
flow.bootWithStart("start",[args])
参数讲解
- flow :流程定义
- order : 流程执行顺序
- mode :流程模式,默认为promiseEvent模式;simple:简单模式
- trigger : trigger的设置,详细见上篇trigger api说明
在流程中的e参数,与trigger一样,只是多出了几个流程控制方法方法
e.end() : 停止流程方法
e.next(nextNode, pass, args) : 指定下个节点方法;
- nextNode:下个节点名称,可以不在流程定义order设置中
- pass: 可选,略过的流程节点数,只在nextNode指向的非定义的流程节点有效
- args:可选,指定nextNode的方法参数
e.changeArgs([]): 改变后续流程的方法参数
e.recoverArgs(): 回复原始方法参数,与changeArgs对应;
另外,需要注意的是
e.stop() : 与trigger的效果一样,停止方法的执行,这里是停止当前节点的后续执行,但不影响 流程的后续执行
使用样例
简单模式
var flow = st.flowController({
flow: {
init: function(name, op) {
log(name, 'init');
},
render: function(name, op) {
log('render');
},
complete: function(name, op) {
log('complete');
}
},
order: ["init", "render", "complete"],
mode: "simple"
})
flow.boot("boot");
expect(arr + '').toBe('boot,init,render,complete');
普通模式
以一个见的控件渲染为例子,正常的有init,render,complete三个节点,还有两个非标准流程节点buildInput和cancel。在init节点中根据name不同还有做流程走向控制
//一个简单的控件渲染流程
var promiseFlow = st.flowController({
flow: {
init: function(e, name, op) {
setTimeout(function() {
log(name, 'init');
//根据name判断下个流程
if (name === 'input')
//改变下个流程的参数
e.next("buildInput", [op.type]);
else if (name === 'cancel')
e.next('cancel') e.resolve();
}, 100)
return e.promise();
},
//非标准流程中的节点
buildInput: function(e, type) {
setTimeout(function() {
log('buildInput');
e.resolve(type);
}, 100)
return e.promise();
},
//非标准流程中的节点
cancel: function(e) {
setTimeout(function() {
log('cancel');
//流程结束
e.end().resolve();
}, 100)
return e.promise(); },
render: function(e, name, op) {
//值传递测试
e.result && log(e.result);
log('render');
},
complete: function(e, name, op) {
log('complete');
}
},
order: ["init", "render", "complete"]
}); //div控件走正常流程
$.when(promiseFlow.boot("div")).done(function() {
expect(arr + '').toBe('div,init,render,complete');
}) //input进入非标准流程
$.when(promiseFlow.boot("input", {
type: 'text'
})).done(function() {
expect(arr + '').toBe('input,init,buildInput,text,render,complete');
}); //end测试
$.when(promiseFlow.boot("end")).done(function() {
expect(arr + '').toBe('end,init,cancel');
})
trigger注入方法例子
var triggerFlow = st.flowController({
flow: {
init: function(e, name, op) {
setTimeout(function() {
log(name, 'init');
e.resolve();
}, 100)
return e.promise();
},
render: function(e, name, op) {
log('render');
},
complete: function(e, name, op) {
log('complete');
}
},
order: ["init", "render", "complete"],
trigger: true
});
it("trigger", function(testCall) {
//init节点注入前置方法
triggerFlow.onBefore("init", "initBefore", function(e, name, op) {
log('initBefore');
}, "once");
//init节点注入后置方法
triggerFlow.on("init", "initAfter", function(e, name, op) {
setTimeout(function() {
log('initAfter');
e.resolve();
}, 100)
return e.promise();
}, "once");
$.when(triggerFlow.boot("div")).done(function() {
expect(arr + '').toBe('initBefore,div,init,initAfter,render,complete');
testCall();
})
})
it("trigger - next", function(testCall) {
//init中注入方法,跳入后续节点
triggerFlow.onBefore("init", "initBefore", function(e, name, op) {
setTimeout(function() {
log('initBefore');
e.next('complete').resolve();
}, 100)
return e.promise();
}, "once");
$.when(triggerFlow.boot("div")).done(function() {
expect(arr + '').toBe('initBefore,div,init,complete');
testCall();
})
})
//注入方法结束节点
it("trigger - end", function(testCall) {
triggerFlow.onBefore("init", "initBefore", function(e, name, op) {
setTimeout(function() {
log('initBefore');
e.end().resolve();
}, 100)
return e.promise();
}, "once");
$.when(triggerFlow.boot("div")).done(function() {
expect(arr + '').toBe('initBefore');
testCall();
})
})
还有很多的流程控制的例子就不一一介绍了,请参考smartjs上的测试用例
smartJS 0.1 API 讲解 - FlowController的更多相关文章
- smartJS 0.1 API 讲解 - PromiseEvent
上篇简单的介绍smartjs了一些通用方法的api.这篇介绍基础的PromiseEvent(这个名字一直没想好,以前准备用callbacks的,但避免与jquery混淆,st的命名空间可以直接挂到$上 ...
- smartJS 0.1 API 讲解 - Trigger
上篇介绍了PromiseEvent,本篇介绍Trigger - 基于Promise的aop的体现:(感觉自己的对这些命名一直都很挫,也懒得想了,所以就凑合的用) Trigger 在目标对象上加入触发器 ...
- smartjs 0.2 OOP讲解 - Klass 类继承
SmartJS2.0加入OOP的功能.OOP包括klass与factory两个对象. Klass 类继承 与其他的类继承相比,smartjs使用了执行指针的概念(后面例子中会介绍),另外提供base基 ...
- smartjs 0.2 OOP讲解 - factory
本篇介绍OOP的第二个对象factory.在以往项目中其实真正使用klass的地方相当少,而factory则是十分常见的. 在smartjs中的factory并不是指的是工厂模式.在factory要求 ...
- 【jquery】 API讲解 内部培训资料
资料在百度云盘 一.jquery API讲解 1.jquery api如何使用 jquery api http://www.hemin.cn/jq/ 2.常用api讲解 选择器: 通过$()获取 ...
- AFNetworking 2.0 新特性讲解之AFHTTPSessionManager
AFNetworking 2.0 新特性讲解之AFHTTPSessionManager (2014-02-17 11:56:24) 转载▼ AFNetworking 2.0 相比1.0 API ...
- Spark 下操作 HBase(1.0.0 新 API)
hbase1.0.0版本提供了一些让人激动的功能,并且,在不牺牲稳定性的前提下,引入了新的API.虽然 1.0.0 兼容旧版本的 API,不过还是应该尽早地来熟悉下新版API.并且了解下如何与当下正红 ...
- ASP.NET CORE 1.0 MVC API 文档用 SWASHBUCKLE SWAGGER实现
from:https://damienbod.com/2015/12/13/asp-net-5-mvc-6-api-documentation-using-swagger/ 代码生成工具: https ...
- Zepto,Zepto API 中文版,Zepto 中文手册,Zepto API,Zepto API 中文版,Zepto 中文手册,Zepto API 1.0, Zepto API 1.0 中文版,Zepto 1.0 中文手册,Zepto 1.0 API-translate by yaotaiyang
Zepto,Zepto API 中文版,Zepto 中文手册,Zepto API,Zepto API 中文版,Zepto 中文手册,Zepto API 1.0, Zepto API 1.0 中文版,Z ...
随机推荐
- css学习笔记 --初学 css代码风格、布局误区
初学css,记录下初学者需要注意的事项. 一.css 代码风格 1.css 命名语义化. 如类名: main 主体 container 内容 footer 站底 right.center ...
- 解决安装完Ubuntu系统后启动项中没有Ubuntu的问题
问题出现的原因是你没有把grub安装到硬盘的起始扇区里,按理说Ubuntu在安装的时候应该能很好的处理这个问题,但有个别电脑还是会出问题.不过我们可以通用命令解决 问题. 使用U盘进入Ubuntu系统 ...
- VUE v-bind绑定class和style
1.绑定class (1)对象语法 <!DOCTYPE html> <html lang="zh"> <head> <meta chars ...
- 生成批量删除多个表sql语句
--批量删除多个表 select 'drop table ' +name from sysobjects where type = 'U' order by name
- PKCS7 的 attached 和 detached 方式的数字签名
搜遍了整个网络,都没有详细的说明.只在一个页面上有介绍,还模棱两可的,地址是:http://docs.oracle.com/cd/E19398-01/820-1228/gfnmj/index.html ...
- 【VBA编程】07.循环结构语句
[FOR...NEXT语句] For counter = start To End [Step step] [statements] [Exit For] [statements] Next [cou ...
- Linux程序员福利 - 追女友神奇(Linux终端运行炫酷程序)
概述 作为IT人员,给同事的感觉呆板,不会会浪漫,不懂情趣.其实不然,我们可以用我们的技能创造出IT人员独有的浪漫.girlLove脚本就可以实现IT人员的浪漫.girlLove本质上是一个简易的问答 ...
- PHPCMS V9使用中的一些心得体会
官方演示站:http://v9.demo.phpcms.cn/ 在线帮助文档:http://v9.help.phpcms.cn/ 案例展示:互联网 http://www.i-busi.com 1. ...
- XP win2003系统 微软雅黑字体的使用方法
微软雅黑是微软公司为其新一代操作系统Vista开发的中文字体,据说它将是迄今为止个人电脑上可以显示的最清晰的中文字体. 微软公司表示,在新一代操作系统中为了能够更加清晰的显示文字,目前正在 ...
- 怎样优化UITableView的性能
在iOS App中,UITableView应该是使用率最高的.同一时候也是最为复杂的视图. 差点儿全部自带的应用中都能看到它的身影,可见它的重要性. 在使用UITableView时,会常常遇到性能上的 ...