Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

trigger('all')的重复回调想法 #13

Closed
army8735 opened this issue Mar 1, 2014 · 14 comments
Closed

trigger('all')的重复回调想法 #13

army8735 opened this issue Mar 1, 2014 · 14 comments
Labels

Comments

@army8735
Copy link
Member

army8735 commented Mar 1, 2014

昨天话题的延伸。

如果有一个callback,同时绑定了某个事件(如a)和all,那么触发a或者all的时候,是否也应该只执行一次?

var e = new Events();
function cb(){console.log(arguments)}
e.on('a', cb)
e.on('all', cb)
//分别触发
e.trigger('all')
e.trigger('a')
@hotoo
Copy link
Member

hotoo commented Mar 1, 2014

我昨天正好也想到这个话题,直觉现有的 all 的设计是有问题的,但是没细想,准备好好看下代码再说。

@antife-yinyue
Copy link
Contributor

非得要设计个 all 的话,可以让 all 不接受绑定,只接受触发,这样就避免重复的问题了

@popomore
Copy link
Member

popomore commented Mar 1, 2014

有道理,可以再仔细想想,其实我不太喜欢这个 API ,默认就返回事件名,那么单独绑定后同一个 callback 也能判断了。—
Sent from Mailbox for iPhone

On Sat, Mar 1, 2014 at 12:12 PM, wǒ_is神仙 notifications@github.com wrote:

非得要设计个 all 的话,可以让 all 不接受绑定,只接受触发,这样就避免重复的问题了

Reply to this email directly or view it on GitHub:
#13 (comment)

@afc163
Copy link
Member

afc163 commented Mar 1, 2014

为啥要有 all ,有人用过吗?

@lepture
Copy link
Contributor

lepture commented Mar 1, 2014

同認為 all 無用

@army8735
Copy link
Member Author

army8735 commented Mar 1, 2014

从未用过all,虽然觉得*比all更好。唯一能想到的用处是,统计这个事件对象总共触发了多少次事件比较方便。

@hotoo
Copy link
Member

hotoo commented Mar 2, 2014

我有过这样的需求,但都是在自己的业务逻辑中实现。
现在仔细想来,这个很容易出问题的 API 由 Events 提供也完全合理。
只是觉得目前的实现方案可能有点问题。

案例

  1. monitor-sens#L57
  2. monitor.js#L190

我的观点

  1. all 事件建议使用 *
  2. all 事件由 Events 提供完全合理。
  3. all 事件应该仔细考虑 onofftrigger 方法,而不是简单屏蔽。

@lifesinger
Copy link
Member

all 借鉴自 Backbone 的 API: http://backbonejs.org/#Events-catalog
可以用来做事件的路由。

如果我们实际上用不到,可以考虑去除。

@lifesinger
Copy link
Member

触发两次,好像不是 bug,本身就如此设计的。谁测测 Backbone 目前的逻辑。

@army8735
Copy link
Member Author

army8735 commented Mar 7, 2014

backbone是两次

@army8735
Copy link
Member Author

army8735 commented Mar 8, 2014

仔细想了下,还是觉得不应该重复。
如果一个cb同时绑定a和b的话,同时触发a和b就应该是2次。
但all是一个抽象出来的集合,实际上是不存在的。因此一个cb同时存在于all和a的话,触发all相当于包括触发一次a,此时cb被执行2次就不合理了。

@lifesinger
Copy link
Member

可以考虑去掉 all

下周组建一个虚拟项目小组,开始每个组件讨论下,确定修改方案
下周人员我圈定后,找大家 kick off 下

2014-03-08 18:33 GMT+08:00 army8735 notifications@github.com:

仔细想了下,还是觉得不应该重复。
如果一个cb同时绑定a和b的话,同时触发a和b就应该是2次。
但all是一个抽象出来的集合,实际上是不存在的。因此一个cb同时存在于all和a的话,触发all相当于包括触发一次a,此时cb被执行2次就不合理了。


Reply to this email directly or view it on GitHubhttps://github.com//issues/13#issuecomment-37094528
.

王保平 / 玉伯(射雕)
送人玫瑰手有余香

@lizzie
Copy link
Member

lizzie commented Mar 13, 2014

Validator 中就有使用 all 的例子, see https://github.com/aralejs/validator/blob/master/src/core.js#L182 用来做一次事件的转发~~

虽少, 但还是有的.

@hotoo
Copy link
Member

hotoo commented Mar 24, 2014

仔细想并看了代码很久,handler 无所谓同一个还是不同一个。
试想同一个 handler 绑定到同一个事件,触发这个事件时, handler 就应该调用 2次。

结论:现在的逻辑貌似没什么问题。

case 1

on(a, h1);
on(b, h1);
trigger(a);

result:

  1. h1()

case 1'

on(a, h1);
on(b, h1);
trigger(all); // diff.

result:

  1. h1()
  2. h1()

case 2

on(a, h1);
on(all, h1);
trigger(a);

result:

  1. h1()
  2. h1()

case 2‘

on(a, h1);
on(all, h1);
trigger(all);

result:

  1. h1()
  2. h1()

@army8735 army8735 closed this as completed Apr 1, 2014
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

8 participants