使用装饰器实现自动发布事件

我们可以使用装饰器,使得对象的方法被调用时,自动发出一个事件。

  1. const postal = require("postal/lib/postal.lodash");
  2. export default function publish(topic, channel) {
  3. const channelName = channel || '/';
  4. const msgChannel = postal.channel(channelName);
  5. msgChannel.subscribe(topic, v => {
  6. console.log('频道: ', channelName);
  7. console.log('事件: ', topic);
  8. console.log('数据: ', v);
  9. });
  10. return function(target, name, descriptor) {
  11. const fn = descriptor.value;
  12. descriptor.value = function() {
  13. let value = fn.apply(this, arguments);
  14. msgChannel.publish(topic, value);
  15. };
  16. };
  17. }

上面代码定义了一个名为publish的装饰器,它通过改写descriptor.value,使得原方法被调用时,会自动发出一个事件。它使用的事件“发布/订阅”库是Postal.js

它的用法如下。

  1. // index.js
  2. import publish from './publish';
  3. class FooComponent {
  4. @publish('foo.some.message', 'component')
  5. someMethod() {
  6. return { my: 'data' };
  7. }
  8. @publish('foo.some.other')
  9. anotherMethod() {
  10. // ...
  11. }
  12. }
  13. let foo = new FooComponent();
  14. foo.someMethod();
  15. foo.anotherMethod();

以后,只要调用someMethod或者anotherMethod,就会自动发出一个事件。

  1. $ bash-node index.js
  2. 频道: component
  3. 事件: foo.some.message
  4. 数据: { my: 'data' }
  5. 频道: /
  6. 事件: foo.some.other
  7. 数据: undefined