Skip to content

Instantly share code, notes, and snippets.

@lifesinger
Created May 3, 2012 09:07
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save lifesinger/2584518 to your computer and use it in GitHub Desktop.
Save lifesinger/2584518 to your computer and use it in GitHub Desktop.
eventproxy questions

朴灵的 EventProxy, README 里有个例子:

var proxy = new EventProxy();
var render = function (template, data, l10n){
    _.template(template, data);
};
proxy.assign("template", "data", "l10n", render);
$.get("template", function (template) {
    // something
    proxy.trigger("template", template);
});
$.get("data", function (data) {
    // something
    proxy.trigger("data", data);
});
$.get("l10n", function (l10n) {
    // something
    proxy.trigger("l10n", l10n);
});

第一反应,用 seajs 等模块加载器会非常简单:

var render = function (template, data, l10n){
    _.template(template, data);
};

seajs.use(["path/to/template", "path/to/data", "path/to/l10n"], function(template, data, l10n) {
  render(template, data, l10n);
});

如果不是文件下载,而是其他一些什么操作,比如:

function done(a, b, c) { ... }

doSomething('A', function(a) {
  doSomething('B', function(b) {
     doSomething('C', function(c) {
         done(a, b, c);
     });
  });
});

不用 eventproxy, 利用普通的 events 模型,也挺容易写的:

function done(a, b, c) { ... }

var eventObj = new Events();

doSomething('A', function(a) {
    eventObj.trigger('step', a);
});

doSomething('B', function(b) {
    eventObj.trigger('step', b);
});

doSomething('C', function(c) {
    eventObj.trigger('step', c);
});

var data = [];
var global = this;

eventObj.on('step', function(o) {
  data.push(o);
  if (data.length === 3) {
    done.apply(global, data);
  }
});

我好像没看到 EventProxy 的更大价值-.-
朴灵能再详细介绍介绍么?

@JacksonTian
Copy link

EP解决的问题是
多异步的场景下,处理都要去写这么一段

eventObj.on('step', function(o) {
  data.push(o);
  if (data.length === 3) {
    done.apply(global, data);
  }
});

用EP,可以直接一步到位,省掉这些非业务相关的检测和判断。让编写者,专注业务逻辑。

@lifesinger
Copy link
Author

那个 assign 接口感觉不够简洁清晰

另外,感觉 proxy 可以在基本的 events 上层去做,而不是又把 on/off/trigger 实现了一遍。

或许接口可以设计为:

function done(a, b, c) { ... }

var eventObj = new Events();

doSomething('A', function(a) {
    eventObj.trigger('eventA', a);
});

doSomething('B', function(b) {
    eventObj.trigger('eventB', b);
});

doSomething('C', function(c) {
    eventObj.trigger('eventC', c);
});

eventObj.on('eventA+eventB+eventC', done);

通过一个加号,来实现事件的联合。

@JacksonTian
Copy link

是的,可以在基本的event层面上完成,但是由于这个代码要用在前端和node中,所以没办法合并进别的事件库中。用加号或者多个参数这个问题到不大,实现不难。

@JacksonTian
Copy link

我的意思就是你们的event库,可以再增强一点,能够支援这种功能。以后肯定会有武场地的。

@lifesinger
Copy link
Author

如无必要,勿增实体哦。在浏览端,深度嵌套的场景不多的,暂时先不考虑,呵呵。

@JacksonTian
Copy link

嗯,前端这种场景较少存在。在后端Node中,这是家常便饭。

@onlytiancai
Copy link

我以前也想过做一个类似的东西,但有了老赵的jscex后,我感觉还是jscex来解决这类问题比较好吧。
以前也是感觉js里写异步任务流比较麻烦,见这个网址:http://www.cnblogs.com/onlytiancai/archive/2011/06/07/2074135.html

我当时想的是设计如下这样的接口

function work1(ev){
    $.get('/work1',function(data){
        ev.trigger(data); 
    })
}
function work2(ev){
    $.get('/work1',function(data){
        ev.trigger(data); 
    })
}
function work3(ev){
    $.get('/work1',function(data){
        ev.trigger(data); 
    })
}

var event1 = makeEvent(), event2 = makeEvent(), event3 = makeEvent();

event3.on(function(){
    console.log('all done');
});
event2.on(function(){
    work3(event3);
});
event1.on(function(){
    work2(event2);
});
work1(event1);

感觉也挺难看的,哈哈,但我觉得下面这样的代码更难看,难以维护,流程调度不集中。

doSomething('A', function(a) {
  doSomething('B', function(b) {
     doSomething('C', function(c) {
         done(a, b, c);
     });
  });
});

@lifesinger
Copy link
Author

jscex 的问题是调试,一旦遇到比较复杂的问题,是在一堆生成后的代码中流转,经常困惑不已

推荐这个小类库:async, 目前用起来感觉挺舒服

@onlytiancai
Copy link

给个链接呀亲,这个是个普通的关键字呀亲

@lifesinger
Copy link
Author

@onlytiancai
Copy link

你好,我写了一个事件管理的库,能满足我之前提到的需求,就是多个异步任务流互相依赖,我的用法如下

em.setup({
    'sequence': ['worker1', 'worker2', 'worker3'],
    'worker1.error, worker2.error': 'default_error_handler',
    'worker1': function(){console.log('worker1 success')}
});
em.start();

源码见这里:https://gist.github.com/2643056
你看这个库实用吗,有没有意义。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment