最近在做一个微信相关的项目。遇到一个情况是当用户关注我时候,需要存储用户信息(同样的需求会有很多,例如:用户预订一个产品,这个时候库存需要做相应变化。等等)。 用我们行内一句话就是:发布订阅。
如果代码直接写可能是这样的: <code> 关注(){ //to do createUser() }
createUser(){ // todo } </code> 如果稍做重构,这两个方法可能不在同一个文件里面,需要引用一下。 即使这样,我感觉我们代码还是紧耦合。
所以我想到了 关注时候发布一个创建人的消息,让创建人的代码一直监听就行。如果有任何人发布消息,我自己去创建不就好了,什么代码做什么事。nodejs真是擅长做这种事情。
如果感觉陌生,看一下文档就这几个方法,真是简单啊。 https://nodejs.org/api/events.html
基本上是这样的:
<code> emitter.listeners(event) 监听 emitter.emit(event[, arg1][, arg2][, …]) 发布 </code>
以下是我的代码: 创建event_emitter.js. (统一管理所有的事件监听)
<code> var person = require(’…/routes/a_person’); </code> <code> var events = require(‘events’); </code> <code> var emitter = new events.EventEmitter(); </code>
<code> /* 创建用户事件监听 */ emitter.on(‘create_person’, person.createPerson); // person.createPerson 是业务代码,创建人的代码。 </code> <code> module.exports = emitter; </code>
在需要微信关注的代码中发布事件。
<code> var emitter = require(’…/routes/base_event’); </code> <code> emitter.emit(‘create_person’,msg.fromUserName,function(){ }); </code>
ok,完成了。
虽然还不是特别理解,慢慢消化吧,感谢楼主分享
@CocaCola183 我回头看时候,也发现语言表达不好。
挺好,用得着,回去试试!
看上去挺好,但是是不是逻辑性、可读性、可维护性都下来了? 有一种情况你可以考虑用这种方式:当你的数个功能逻辑都需要用到同一种处理过程的时候,可以考虑,但是建议尽量还是定义和调用公共模块,使功能实现有完整的流程性和逻辑性,否则代码逻辑在不同文件中跳来跳去,会不会看了之后晕乎乎的?
嗯,多了一种思路也不错~ 4楼说的有道理,代码维护性可能受影响。多谢分享
谢谢 @zlbbq @lgyhitler 的回复。 感觉不错。下面是我的理解
从使用情况来看,代码在不同文件中跳来跳去,会晕晕乎乎的情况还好。
因为发布-订阅-业务逻辑。 代码固定在自己应该所在的位置,看起来还可以。
之所以采用这个方法,主要是两个不相关的实体,出现业务联系的时候,采用的。 如果业务紧密我感觉直接调用会更好。
比如:
适宜采用:订单生成时候,需要发消息给其他部门。
不适宜采用:订单和订单明细(主表和子表)的生成。
有1对多的可能,所以少用,不然以后会有莫名其妙的问题。好比ios里的notification和android的广播。
建议看看eventproxy