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

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

  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();

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

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

es6 使用修饰器实现自动发布事件相关推荐

  1. es6 Trait修饰器

    Trait修饰器 ES6 Trait 也是一种修饰器,效果与 Mixin 类似,但是提供更多功能,比如防止同名方法的冲突.排除混入某些方法.为混入的方法起别名等等. 下面采用traits-decora ...

  2. es6 使用修饰器实现Mixin模式

    使用修饰器实现Mixin模式 在修饰器的基础上,可以实现Mixin模式.所谓Mixin模式,就是对象继承的一种替代方案,中文译为"混入"(mix in),意为在一个对象之中混入另外 ...

  3. es6 为什么修饰器不能用于函数

    为什么修饰器不能用于函数 ES6 修饰器只能用于类和类的方法,不能用于函数,因为存在函数提升. var counter = 0; var add = function () { counter++; ...

  4. “睡服”面试官系列第二十三篇之修饰器(建议收藏学习)

    目录 1. 类的修饰 2. 方法的修饰 3. 为什么修饰器不能用于函数? 4. core-decorators.js 4.1@autobind 4.2@readonly 4.3@override 4. ...

  5. ES6里的修饰器Decorator

    修饰器(Decorator)是一个函数,用来修改类的行为. 一.概述 ES6 引入了这项功能,目前 Babel 转码器已经支持Decorator 首先,安装babel-core和babel-plugi ...

  6. ES6新特性之修饰器

    修饰器(Decorator) 修饰器(Decorator)是一个函数, 用来修改类的行为. ES2017 引入了这项功能, 目前 Babel 转码器己经支持. 使用: <script>@T ...

  7. es6 Babel 转码器对修饰器的支持

    Babel 转码器对修饰器的支持 目前,Babel 转码器已经支持 Decorator. 首先,安装babel-core和babel-plugin-transform-decorators.由于后者包 ...

  8. es6 方法的修饰器

    方法的修饰器 修饰器不仅可以修饰类,还可以修饰类的属性. class Person { @readonly name() { return `${this.first} ${this.last}` } ...

  9. es6 Decorator类的修饰器

    类的修饰器 许多面向对象的语言都有修饰器(Decorator)函数,用来修改类的行为.目前,有一个提案将这项功能,引入了 ECMAScript. @testable class MyTestableC ...

最新文章

  1. 《浪潮之巅》--百年帝国读后感
  2. python什么软件开发好_python怎样才能学好?python软件开发什么
  3. C语言非常大的数组,关于最大子数组问题
  4. 170329、用 Maven 部署 war 包到远程 Tomcat 服务器
  5. Google最热开源项目
  6. Docker : Error response from daemon: Get https://docker.elastic.co/v2/: net/http: TLS handshake time
  7. NHibernate 设置字段的默认值的办法
  8. android 素材标签,Android Studio矢量素材资源导入错误 – 不支持标签
  9. surf算子匹配物体
  10. VMAX数智化体系架构
  11. 【统计学】从样本到总体
  12. 推荐一款GIF动图制作软件--ScreenToGif
  13. ASP.NET入门篇【项目实战】打造一个自己的相册(二)登录模块
  14. SpringMvc中关于@ResponseBody和HashMap的用法
  15. 项目管理常用工具介绍:工作分解结构WBS
  16. LVS负载均衡之--DR模式
  17. 混合整数线性规划(MILP)
  18. 博通Broadcom SDK源码学习与开发7——HAL硬件抽象层分析
  19. day11 - 手写数字笔迹细化
  20. K8s容器的资源单位理解

热门文章

  1. python爬虫从入门到放弃(九)之 实例爬取上海高级人民法院网开庭公告数据
  2. 网络(8)-HTTP、Socket、TCP、UDP的区别和联系
  3. maven仓库启用国内云的方法,含完整配置文件
  4. C语言编程序编数独,求用C语言编一个解九宫格数独的程序怎么办? 爱问知识人...
  5. php权限设置,php设置权限的方法
  6. linux mysql 乱码怎么解决_MySQL_linux中解决mysql中文乱码方法,改默认编码:/etc/init.d/my - phpStudy...
  7. Spring框架的快速入门
  8. spring配置日志
  9. GCC同时使用静态库和动态库链接
  10. java8的日期API总结(JSR310)