前端异步编程系列之事件发布/订阅模式(2/4)

本文详细介绍了事件发布/订阅模式在前端异步编程中的应用,包括其工作原理、如何改善异步编程的问题,如解决回调嵌套、多异步协同和雪崩问题。通过实例展示了如何使用事件发布/订阅模式处理文件读取和微信小程序接口调用,同时讨论了异常处理策略。最后提到了生产环境中常用的事件库,并预告了下篇将介绍Promise/Deferred模式。
摘要由CSDN通过智能技术生成

上一篇文章中,主要是介绍了什么是异步编程,而这从这篇文章开始,我会介绍一些异步编程的一些解决方案。

目前异步编程的解决方案主要有一下几种:

1.事件发布/订阅模式

2.Promise/Deferred模式

3.流程控制库

而我们这一篇文章主要是介绍第一种,即事件发布/订阅模式,后续会介绍Promise/Deferred模式以及es6的Promise实现,至于第三种,我并不是太过于了解,所以,近期不会介绍。

好了,话不都说,下面就开始介绍事件发布/订阅模式是如何改善我们的异步编程的。




事件发布/订阅模式

说到前端的事件,脑子第一想到的估计就是js给dom添加的那些事件,但是,这里的异步编程靠的并不是那些已经被js定义好的那些事件,真正用于异步编程的是事件发布/订阅的这种模式:

在这个模式中,会存在一个事件对象,他的作用在于发布事件,叫做发布者。

还有一个叫做观察者(或者订阅者)的用来订阅发布者所发布出来的事件。

当发布者中所发布的某一个事件发生时,发布者会通知(其实就是调用)所有订阅了这个事件的观察者。

其实他们的关系就好比杂志社和读者的关系:

杂志社发布了一种杂志,读者可以订阅这种杂志。而每当杂志社每个月发布最新的一期的杂志时,都会把最新的杂志寄给所有订阅了这种杂志的读者。就是这么个关系。

在这里或者说在前端中,事件对象(发布者)是一个对象,他可以发布事件,取消事件,触发事件,并能够通知所有订阅了这个事件的观察者。而观察者说白了就是一个函数、方法,当发布者触发了某个事件时,通知观察者其实就等价于调用这个函数罢了。

好,现在来说一说这种事件发布/订阅模式和异步编程的关系以及他为什么会适合异步编程的思想

 异步编程在执行了某个异步操作时,直接返回,不会再去理会,而我们只需要为其添加一个回调函数,用于当异步操作结束时,再执行这个回调函数即可。

而事件模式和这种异步思维极其类似。我订阅某个事件,并把事件发生时的处理函数作为观察者添加上去,当事件发生时,发布者会执行观察者这个处理函数。他是回调函数的事件化,极其类似却更加灵活。

熟悉前端的都非常熟悉dom事件了,不过,其实专门用于异步编程的事件发布/订阅模式,可是比前端大量dom事件更为简单,因为用户异步编程的事件订阅/发布模式不存在事件捕获,冒泡,preventDefault()以及sotpPropagation()这些东西。所以,是不是听起来松了一口气。确实是这样,因为异步编程的事件发布/订阅模式根据上面所解释的,只需要以下几个函数:

on  用户注册观察者

removeListener  删除某一个事件的所有观察者(其实就等于删除这个事件了)

emit  触发某一个事件,从而调用这个事件的所有观察者。

// 其他

once  注册只执行一次的事件,只触发一次就删除的事件

removeAllListener  删除这个事件对象的所有事件。

我们来看一下事件订阅/发布模式的使用:

// 订阅
emitter.on("event1", function (message) {
    console.log(message);
});
// 触发
emitter.emit('event1', "I am message!");
// 打印 I am message!

其中emitter.on方法中第一个参数是订阅的事件名称,第二个参数是事件发生时的处理函数,也就是观察者。而emitter.emit则是用来触发event1这个事件,"I am message!" 是传递的参数,这个参数会传递给观察者。

一个事件可以有多个观察者,也就是可以有多个处理函数,并且事件和观察者可以随意的删除和修改,非常的灵活,并且事件发生和处理函数之间可以很方便的解耦。我不管这个事件发生时怎么去处理,也不用管这个事件有多少个观察者,而且数据通过消息参数的方式可以很灵活的传递。

那么事件订阅/发布模式他对比普通的回调函数,可以解决异步编程的哪些问题呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值