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

时间: 2024-11-09 00:40:34

smartJS 0.1 API 讲解 - FlowController的相关文章

smartJS 0.1 API 讲解 - PromiseEvent

上篇简单的介绍smartjs了一些通用方法的api.这篇介绍基础的PromiseEvent(这个名字一直没想好,以前准备用callbacks的,但避免与jquery混淆,st的命名空间可以直接挂到$上) PromiseEvent 基于事件和promise的回调管理,类似于jquery的callbacks,但具有结果传递,优先级,事件参数,promise控制等功能 接口方法 var events = st.promiseEvent(mode); events.add(name,function(e

smartJS 0.1 API 讲解 - Trigger

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

smartjs 0.2 OOP讲解 - Klass 类继承

SmartJS2.0加入OOP的功能.OOP包括klass与factory两个对象. Klass 类继承 与其他的类继承相比,smartjs使用了执行指针的概念(后面例子中会介绍),另外提供base基类和初始化控制的扩展功能. 首先来看看接口: var _klass = st.klass(name, prop, parent, config); //new _klass() 与 _klass()效果相同,实现了自初始化功能更 var obj = new _klass(); name : 类名 p

smartjs 0.2 OOP讲解 - factory

本篇介绍OOP的第二个对象factory.在以往项目中其实真正使用klass的地方相当少,而factory则是十分常见的. 在smartjs中的factory并不是指的是工厂模式.在factory要求定义一个基础对象,这个对象可以是基类,也可以是模板对象或者是接口.然后factory就已此基础对象为基础,其他添加或者创建的对象,继承或者是复制基础对象的属性和方法.factory在提供一系列方法来对这些对象做控制. factory经过简单的处理可以实现工厂.外观.模板等设计模式. 接口说明 //多

AFNetworking 2.0 新特性讲解之AFHTTPSessionManager

AFNetworking 2.0 新特性讲解之AFHTTPSessionManager (2014-02-17 11:56:24) 转载▼     AFNetworking 2.0 相比1.0 API 接口改动还是很大的. 其中一个便是 AFURLSessionManager,当然如果你不太熟悉,或者为了兼容低版本,你依然可以选择AFHTTPRequestOperationManager,AFURLSessionManager是基于 NSURLSessionConfiguration(IOS 7

【jquery】 API讲解 内部培训资料

资料在百度云盘 一.jquery  API讲解 1.jquery  api如何使用 jquery  api http://www.hemin.cn/jq/ 2.常用api讲解 选择器: 通过$()获取jquery对象的常用方式: #div1          根据元素id获取 .red             根据class获取 div               根据标签名字获取 #div1 ul li input  混合模式 li.red 查找带red这个class的li input[typ

OAuth2.0学习(5-4)新浪开放平台-微博API-使用OAuth2.0调用API

使用OAuth2.0调用API 使用OAuth2.0调用API接口有两种方式: 1. 直接使用参数,传递参数名为 access_token URL 1 https://api.weibo.com/2/statuses/public_timeline.json?access_token=abcd 2.在header里传递,形式为在header里添加 Authorization:OAuth2空格abcd,这里的abcd假定为Access Token的值,其它接口参数正常传递即可. 注:所有的微博开放

【循序渐进地学好OpenCV&4】使用2.0的API显示图片以及OpenCV的自动化内存管理

1.0 显示图片和2.0显示图片的比较 在[[循序渐进地学好OpenCV&2]显示图片--OpenCV的"起手式"](http://blog.csdn.net/zgljl2012/article/details/48306299)这篇文章里,我们使用了OpenCV 1.0的API实现了从磁盘读取文件并显示,下面是代码: #incldue "cv.h" #include "highgui.h" int main(int argc, char

Bluetooth 4.0之Android 讲解

Android平台包含了对蓝牙网络协议栈的支持,它允许一个蓝牙设备跟其他的蓝牙设备进行无线的数据交换.应用程序通过Android蓝牙API提供访问蓝牙的功能.这些API会把应用程序无线连接到其他的蓝牙设备上,具有点到点和多点无线特征. 使用蓝牙API,Android应用程序能够执行以下功能: 1.  扫描其他蓝牙设备 2.  查询本地已经配对的蓝牙适配器 3.  建立RFCOMM通道 4.  通过服务发现来连接其他设备 5.  在设备间传输数据 6.  管理多个蓝牙连接 基础 本文介绍如何使用A