异步编程解决方案之事件发布/订阅模式

时间监听模式是广泛用于异步编程的模式,是回调函数的事件化,又称不发订阅模式。

nodejs的events模块就是发布订阅模式的一个简单实现,不存在preventDefault,stopPropagation,stopImmediatePropagation,等控制事件传递的方法。

它具有addListner/on(),once(),removeListner(),removeAllLisetner()和emit等基础监听事件方法。

事件发布/订阅十分简单,如下:

//订阅
emitter.on(‘event1‘, function (message) {
  console.log(message)
})
//发布
emmiter.emit(‘event1‘, ‘this is a message‘);

可以看到,事件订阅就是一个高阶函数的应用。

事件侦听器就是一个钩子函数hook

const options = {
    host: ‘www.abc.com‘,
    port: ‘80‘,
    path: ‘/get‘,
    method: ‘GED‘
}

let req = http.request(options, function (res) {
    console.log(‘STATUS:‘ + res.statusCode);
    console.log(‘HEADERS:‘, JSON.stringify(res.headers));
    res.setEncoding(‘utf8‘);
    res.on(‘data‘, function (chunck) {
        console.log(chunck);
    });
    res.on(‘end‘, function () {
        console.log(‘ -- end -- ‘);
    })

    req.on(‘error‘, function (e) {
        console.log(‘problem with requrest: ‘ + e.message);
    })
    req.wirte(‘data\n‘);
    req.wirte(‘data\n‘);
    req.end();
});

在这段程序内,程序员只需要关注内部的error、data、end这些事件点上即可,至于内部的流程,无需关注。

备注:如果一个事件添加了超过十个侦听器就会被警告,防止CPU和内存暂用过多资源,emitter.setMaxListeners(0)将这个限制去掉;

   EventEmitter对error事件做了特殊对待,如果这个事件没有被捕获,就会引起线程退出。一个健壮的EventEmitter应该对error处理;

1、继承EventEmitter类是十分简单的,以下代码是node中Stream对象继承EventEmitter的例子

let events = require(‘events‘);

function Stream () {
  events.EventEmitter.call(this);
}

util.inherits(Stream, events.EventEmitter);

node核心模块中有近半数继承自EventEmitter

2、利用事件队列解决雪崩问题

假如站点刚好启动,这时候缓存中是不存在数据的,而如果访问量巨大,同一个sql发送到数据库中反复查询,会影响服务的整体性。

var select = function (callback) {
  db.select(‘SQL‘, function (results) {
    callback(results);
  })
}

解决方案是添加一个状态锁

var status = ‘ready‘;
var select = function (callback) {
  if (status === ‘ready‘) {
    status === ‘pending‘;
    db.select(‘SQL‘, function(results) {
      status = ‘ready‘;
      callback(results);
    })
  }
}

但是这种情况下,多次调用select,只会有一次生效,后续select没有数据服务的,这个时候我们可以引入事件队列:

var proxy = new events.EventEmitter();
var status = ‘ready‘;
var select = function (callback) {
    proxy.once(‘selected‘, callback);
    if (status === ‘ready‘) {
        status === ‘pending‘;
        db.select(‘SQL‘, function (results) {
            proxy.emit(‘select‘, results);
            status = ‘ready‘;
        })
    }
}

这里面我应用了once方法,将请求回调都压在事件队列中,利用他执行一次就将监听器移除的特点,保证他每一个回调都执行一次。

原文地址:https://www.cnblogs.com/yingquliang/p/9368469.html

时间: 2024-10-07 19:52:33

异步编程解决方案之事件发布/订阅模式的相关文章

nodejs学习笔记 —— 异步编程解决方案

在js或者node编程中,由于异步的频繁和广度使用,使得回调和嵌套的深度导致编程的体验遇到一些挑战,如果写出优雅和好看的代码,本文主要针对异步编程的主流方案做一些总结 1.事件发布/订阅模式 事件监听器模式是一种广泛用于异步编程的模式, 是回调函数的事件化,又称发布/订阅模式, node自身提供events模块,是该模式的一个简单实现. EventPorxy 2.promise/deferrd模式 在2009年被Kris Zyp抽象为一个提议草案,发布在CommonJS规范中, 目前,Commo

异步编程解决方案

事件发布/订阅模式 promise/deferrd模式 流程控制模式 事件发布/订阅模式 事件监听器模式是异步回调的事件化,又称发布订阅/模式 node核心模块events 方法 addListener/on once removeListener removeAllListeners emit 简单操作 let events = require('events') let request = require('http').request let emit = new events.Event

JS设计模式(5)发布订阅模式

什么是发布订阅模式(观察者模式)? 定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作. 何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知. 如何解决:使用面向对象技术,可以将这种依赖关系弱化. 关键代码:对于某一个topci用数组存放订阅者. 应用实例: 1.拍卖的时候,拍卖师观察最高标价,然后

C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命

使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠xxx" 一  双向耦合的代码 首先需要一个猫类Cat 一个老鼠类Rat 和一个测试类Program 老鼠类的代码如下 //老鼠类 public class Rat { public string Name { get; set; } //老鼠的名字 public Cat MyCat { get;

JavaScript设计模式与开发实践---读书笔记(8) 发布-订阅模式

发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 发布-订阅模式可以广泛应用于异步编程中,这是一种替代传递回调函数的方案. 可以取代对象之间硬编码的通知机制,一个对象不用再显式地调用另外一个对象的某个接口. 自定义事件 首先要指定好谁充当发布者: 然后给发布者添加一个缓存列表,用于存放回调函数以便通知订阅者: 最后发布消息时,发布者会遍历这个缓存列表,依次触发里面存放的订阅者回调函数. 另外,我们还可以往回调函数里填入

JavaScript设计模式之----原生JS实现简单的发布订阅模式

第一部分: 发布订阅模式简介 发布—订阅模式又叫观察者模式,它定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知.在javascript开发中,一般用事件模型来替代传统的发布—订阅模式. 发布—订阅模式可以广泛应用于异步编程中,是一种替代传递回调函数的方案.比如,可以订阅ajax请求的error.success等事件.或者如果想在动画的每一帧完成之后做一些事情,可以订阅一个事件,然后在动画的每一帧完成之后发布这个事件.在异步编程中使用发布—订阅模式,就无需过

发布订阅模式的理解

发布---订阅模式它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 发布订阅模式的优点: 支持简单的广播通信,当对象状态发生改变时,会自动通知已经订阅过的对象. 发布者与订阅者耦合性降低,发布者只管发布一条消息出去,它不关心这条消息如何被订阅者使用,同时,订阅者只监听发布者的事件名,只要发布者的事件名不变,它不管发布者如何改变: 对于第一点,我们日常工作中也经常使用到,比如我们的ajax请求,请求有成功(succes

Javascript中理解发布--订阅模式

阅读目录 发布订阅模式介绍 如何实现发布--订阅模式? 发布---订阅模式的代码封装 如何取消订阅事件? 全局--发布订阅对象代码封装 理解模块间通信 回到顶部 发布订阅模式介绍 发布---订阅模式又叫观察者模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 现实生活中的发布-订阅模式: 比如小红最近在淘宝网上看上一双鞋子,但是呢 联系到卖家后,才发现这双鞋卖光了,但是小红对这双鞋又非常喜欢,所以呢联系卖家,问卖

设计模式--观察者模式(发布订阅模式)

观察者模式又叫做发布—订阅模式,是我们最常用的设计模式之一.它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知和更新. 观察者模式提供了一个订阅模型,其中对象订阅事件并在发生时得到通知,这种模式是事件驱动的编程基石,它有利益于良好的面向对象的设计. 从上面的话语我们可以得知,观察者模式主要动力是促进形成松散耦合(解耦). 设计思路: 首先先声明一个观察者对象 // 注册观察者对象 var Observer = (function (){ var Oms