javascript框架–brook

javascript框架–brookbrookbrook 是一个针对大规模 web 开发的 Javascript 框架 而不是一个工具集 brook 引用了 UNIX 下的 pipe 概念 轻松把所有的处理都串联起来以共同完成任务 前一个处理的输出作为后一个处理的输入来完成参数的传递 通过 brook 你可以以 MVC 的方式来写你的 javascript 程序 http hirokidaichi github com brook b

brook

brook是一个针对大规模web开发的Javascript框架,而不是一个工具集。

brook引用了UNIX下的pipe概念,轻松把所有的处理都串联起来以共同完成任务。前一个处理的输出作为后一个处理的输入来完成参数的传递。通过brook你可以以MVC的方式来写你的javascript程序。

http://hirokidaichi.github.com/brook/

brook框架使用namespace库用于模块的组织。

这里再次用例子说明一下namespace的使用方法:

 1 // 定义一个sample命名空间
2 Namespace('sample')
3 // 使用brook
4 .use('brook *')
5 .use('brook.util *')
6 .define( function (ns) {
7 var foo = function() {
8 alert('this is sample.foo');
9 };
10
11 // 定义对外公开的函数
12 // 外部模块只要use了sample之后,就可以通过ns.sample.foo()来调用
13 ns.provide({
14 foo : foo
15 });
16 });
17
18 // 使用的例子
19 Namespace.use('sample').apply(function(ns) {
20 ns.sample.foo();
21 });











































promise

简单来说,promise就是封装过的函数,它就是负责把值传给下一个promise。就好比接力赛时候,把接力棒(value)传给下一个成员(promise)。这样就可以可以让非同步的处理能够按照类似同步处理的顺序来编程。

1 var p = ns.promise(function(next, value){ 
   
2 // 在这里对value进行处理
3 // value是之前的promise传递进来的
4
5 // 把工作移交给下一个promise
6 next("new_value");
7 });







那我们来看看promise能做什么。比如有这样的要求

1:等一秒

2:输出moge

3:等两秒

4:输出muga

不用promise的时候:

 1 (function() { 
   
2 var firstInterval = setInterval(function() {
3 console.log("moge");
4 clearInterval(firstInterval);
5 var secondInterval = setInterval(function() {
6 console.log("muga");
7 clearInterval(secondInterval);
8 }, 2000);
9 }, 1000);
10 })();

























这样的代码处理顺序不好理解。如果改用promise的话:

 1 Namespace("sample")
2 .use("brook *")
3 .use("brook.util *")
4 .define(function(ns) {
5 var p1 = ns.promise(function(next, value) {
6 console.log("moge");
7 next("muga");
8 });
9
10 var p2 = ns.promise(function(next, value) {
11 console.log(value);
12 next();
13 });
14
15 ns.provide({
16 execute: function() {
17 ns.wait(1000).bind(p1).bind(ns.wait(2000)).bind(p2).run();
18 }
19 });
20 });
21
22 Namespace.use("sample").apply(function(ns) {
23 ns.sample.execute();
24 });



































































其中bind函数可以接受多个参数,也可以写成这样:

ns.wait(1000).bind(p1, ns.wait(1000), p2).run();

promise的使用方法:

1:等待几秒可以使用brook.util下的wait方法

2:promise之间“棒的交接”是通过bind方法实现的,也就是UNIX下的PIPE功能。

3:最后需要执行run()方法

channel

channel顾名思义就是频道,管道的意思。在brook里它表示promise的集合。可以把多个promise存放到一个channel里,然后一起执行。

 1 var p3 = ns.promise(function(next, value) { 
   
2 console.log(value + "!");
3 });
4
5 var p4 = ns.promise(function(next, value) {
6 console.log(value + "!!");
7 });
8
9 ns.provide({
10 execute: function() {
11 var channel = ns.channel("testChannel");
12 channel.observe(p3);
13 channel.observe(p4);
14 ns.sendChannel("testChannel").run("hello");
15 }
16 });











































1:observer:把promise追加到channel中

2:sendChannel:确定channel

3:最后通过run来执行channel里所有promise

model

model是对channel进行包装而成的。在model里可以定义带有名字的channel,这些channel都是一个个的method。

这个组件可以明确MVC中的M和V,即模块和视图。它可以写出这样的处理,model的method执行之后,它的结果传到一个或者多个view(promise)。这就是观察者模式。

var requestFilter = ns.promise(function(v){ 
   
v["viewer_id"] = viewer.getID();
retrun v;
});

var create = ns.promise(function(n,v){
// get data
n(response);
});
var delete = ns.promise(function(n,v){
// get data
n(response);
});

var view1 = ns.promise(function(n,v){
// render html
n(v);
});
var view2 = ns.promise(function(n,v){
// render html
n(v);
});

var model = ns.createModel();
model.addMethod('create', ns.mapper(requestFilter).bind(create));
model.addMethod('delete', ns.mapper(requestFilter).bind(delete));

ns.from(model.method('create')).bind(view1).run();
ns.from(model.method('create')).bind(view2).run();

ns.promise().bind(model.notify('create').run({"body": "test"}));
//向view1和view2传递参数{"body": "test"}















































































model的使用方法:

1:ns.createModel():生成model

2:model.addMethod():定义method名和相应的处理promise

3:ns.from():定义model的某个method执行完之后的处理

4:model.notify():执行model的method

widget

widget负责把html和命名空间的模块关联起来。看一个简单的例子。

首先定义一个sample.widget的namespace。

 1 // sample-widget.js
2 Namespace("sample.widget")
3 .use("brook.widget *")
4 .define(function(ns) {
5 ns.provide({
6 registerElement: function(element) {
7 element.innerHTML = "Hello World!";
8 }
9 });
10 });






















下面就是关于sample.widget的html页面。

 1 
2
3 widget sample
4
5
6
7





8
9

widget


10
hoge

11
foo

12
bar

13
19






20






























这段代码会把data-widget-namespace指定为sample.widget的div内容全部置换成hello world!

run()和subscribe()的区别

promise执行的时候需要使用run()方法。一个promise链处理完之后需要执行回调函数的时候不使用run,使用subscribe。

 1 ns.promise().bind(function(next, value) { 
   
2 next(value);
3 }).subscribe(function(value) {
4 console.log(value, "world!");
5 }, "hello");
6 //hello world!
7
8
9 ns.promise().bind(function(next, value) {
10 console.log(value);
11 next("no next");
12 }).run("hello");
13 //hello































brook.util

这个模块里面定义很多有用的方法。

mapper:定义装饰处理

 1 var input = ns.promise(function(next, value) { 
   
2 next("this is input");
3 });
4
5 var mapper = ns.mapper(function(value) {
6 return value + "!";
7 });
8
9 var output = ns.promise(function(next, value) {
10 console.log(value);
11 next(value);
12 });
13
14 //执行
15 input.bind(mapper).bind(output).run();
16 //this is input!








































filter:过滤器

 1 var input = ns.promise(function(next, value) { 
   
2 next(2);
3 });
4
5 var evenFilter = ns.filter(function(value) {
6 return (value % 2) === 0;
7 });
8
9 var output = ns.promise(function(next, value) {
10 console.log(value + " is even");
11 next(value);
12 });
13
14 //执行
15 input.bind(evenFilter).bind(output).run();
16 //2 is even








































scatter:分散器,value里面的值依次调用下一个promise

 1 var output = ns.promise(function(next, value) { 
   
2 console.log(value);
3 next(value);
4 });
5
6 //执行
7 ns.scatter().bind(output).run([1, 2, 3, 4, 5, 6]);
8 //1
9 //2
10 //3
11 //4
12 //5
13 //6
















 1 var output = ns.promise(function(next, value) { 
   
2 console.log(value);
3 next(value);
4 });
5
6 //実行
7 ns.scatter().bind(ns.takeBy(2)).bind(output).run([1, 2, 3, 4, 5, 6]);
8 //[1, 2]
9 //[3, 4]
10 //[5, 6]
















cond:有条件执行promise,第一个参数是过滤器,第二个参数是promise。第一个参数为true的时候执行第二个参数的promise。

 1 var output = ns.promise(function(next, value) { 
   
2 console.log(value);
3 next(value);
4 });
5
6 var isEven = function(num) {
7 return (num % 2 === 0);
8 };
9
10 var done = ns.promise(function(next, value) {
11 console.log("done");
12 });
13
14 //実行
15 ns.cond(isEven, output).bind(done).run(2);
16 //2
17 //done
18
19
20 ns.cond(isEven, output).bind(done).run(3);
21 //done

















































 1 var dispatchTable = { 
   
2 "__default__": ns.promise(function(next, value) {
3 console.log("default");
4 }),
5
6 "hello": ns.promise(function(next, value) {
7 console.log("hello");
8 }),
9
10 "world": ns.promise(function(next, value) {
11 console.log("world");
12 })
13 };
14
15
16 ns.match(dispatchTable).run("hello");
17 ns.match(dispatchTable).run("world");
18 ns.match(dispatchTable).run("hoge");

















































from:为promise链传递初始参数,也可以用run来传递。

1 ns.from("hello").bind(ns.debug()).run();
2 //debug: hello

最后还可以通过github首页的例子来体会,brook是怎么实现MVC模式的。

转载于:https://www.cnblogs.com/foxracle/archive/2011/10/10/2205334.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220889.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午7:25
下一篇 2026年3月17日 下午7:26


相关推荐

  • 计算机组成原理相关话题,计算机组成原理基本的知识点.doc

    计算机组成原理相关话题,计算机组成原理基本的知识点.doc

    2021年11月27日
    45
  • 优秀的有趣的博客

    优秀的有趣的博客昨晚和几个老同学小聚,聊得很开心。忘了到哪儿聊起一些牛人的博客,走得时候华仔还一直说要我一定记得把博客链接email给他。索性写个资源帖,记录一些我经常浏览的博客,并在此向所有提供,分享优秀资源的博主们致敬!也期待大家能留言推荐其他优秀的博客~大牛:刘未鹏http://mindhacks.cn/绝对的绝对的大牛,在大一时读到他的《我在南大的七年》,从此成了我和我身边很多朋友的必…

    2025年8月28日
    7
  • Hybrid App开发 四大主流平台「建议收藏」

    Hybrid App开发 四大主流平台「建议收藏」HybridApp在过去的两年中已经成为移动界的核心话题,但是作为一名Web开发者来说要如何站在移动互联网的浪潮之巅呢?是选择学习原生开发,研究Java、Object-C、C#等语言,还是选择继续使用网页开发,容忍HTML5功能的局限性?就在开发者左右为难的情况下HybridApp作为一个折中的解决方案诞生了。那么究竟什么才是HybridApp呢?HybridApp概念…

    2022年5月11日
    38
  • 利用java生成uuid

    利用java生成uuid在实际项目中,我们可能想生成一个随机的而且可以保证唯一的标识,比如在给图片命名时,这时就可以采用uuid来生成随机字符串,这个随机字符串基本上是不会出现重复的。什么是UUIDuuid,就是通用唯一识别码的缩写。它的组成比较复杂,是基于当前时间(纳秒级时间)、计数器、硬件标识(通常是MAC地址)以及随机数等组合来生成的,一般情况下,不会生成重复的UUID(重复几率非常小,据概率估计,若每秒产生10亿笔UUID,100年后只产生一次重复的机率是50%),所以,我们大可不必考虑发生重复的问题。它有很多不

    2026年2月17日
    3
  • 代码空间项目 — InstantiationException的异常

    代码空间项目 — InstantiationException的异常java.lang.InstantiationException实例化异常。当试图通过newInstance()方法创建某个类的实例,而该类是一个抽象类或接口时,抛出该异常。这次项目中查询type时候

    2022年7月1日
    25
  • 计算机快捷键任务管理器,任务管理器快捷键,小编教你电脑如何打开任务管理器…

    计算机快捷键任务管理器,任务管理器快捷键,小编教你电脑如何打开任务管理器…很多时候,我们需要用到任务管理器,通过系统中自带的任务管理器,我们可以查看到当前运行的应用程序、进程、硬件使用情况等。对于电脑小白来说,不知道任务管理器怎么打开,因此,小编给大家整理这篇打开任务管理器的图文。电脑系统的任务管理器是Windows提供有关计算机性能的信息,并显示了计算机上所运行的程序和进程的详细信息,从这里可以查看到当前系统的进程数、CPU使用比率、更改的内存、容量等数据。那么,任务…

    2022年6月18日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号