1. 说明一下主要逻辑

当我们发送多个请求时使用的时同一个接口,并且这个接口支持多个参数获取多个条数据,而我们不想要每次请求一条数据就发送一条请求

而是在指定的时间段类发送一次请求,得到一些数据,然后把这些数据 返回到对应的发起请求的地方

2. 使用场景

比如像QQ聊天会有一个联系人列表,这个列表每个联系人会有一个头像,我们可以通过一个接口获取指定的用户的头像图片链接,也可以一次性获取多个头像链接,只需要有多个用户ID即可

但是一般都是会在联系人列表渲染时,每渲染一个联系人列表发送一次请求,这样就会发送多次请求,造成不必要的浪费,我们选择获取联系人列表之后只发送一次请求就行

3. 实现一个简单的发布订阅者模式

let event ={

events:[],/**

* 添加订阅

* @param {[String]} event [description]

* @param {Function} fn [description]

* @return {[undefined]} [description]*/on(event, fn){if(!event || !fn) return;

let hasEvent= this.hasEvent(event);if(hasEvent){

hasEvent.handler.push(fn);

}else{this.events.push({

type: event,

handler: [ fn ]

});

}

},/**

* 发布订阅

* @param {[String]} event [description]

* @param {...[any]} arg [description]

* @return {[undefined]} [description]*/emit(event, ...arg){

let hasEvent= this.hasEvent(event);if(hasEvent){

hasEvent.handler.forEach(fn=>fn(...arg));

}else{

console.log('该事件还没有订阅');

}

},/**

* 判断该事件是否已经注册

* @param {[String]} event [description]

* @return {Boolean} [description]*/hasEvent(event){return this.events.find(ele=>ele.type ===event);

},/**

* 移除订阅事件

* @param {[type]} event [description]

* @param {Function} fn [description]

* @return {[type]} [description]*/removeEvent(event, fn){if(event &&fn){

let eve= this.hasEvent(event);if(eve){

eve.handler.splice(eve.handler.indexOf(fn),1);

}

}if(event && !fn){for(let i = 0; i< this.events.length; i++){if(this.events[i].type ===event){this.events.splice(i, 1);break;

}

}

}

}

}

3. 书写Ajax请求函数

functionajax(url, data){

clearTimeout(ajax.timer);if(!ajax.dataArr){

ajax.dataArr=[];

}

ajax.dataArr.push(data);

ajax.timer= setTimeout(()=>{ // 限制在300毫秒内的请求会只请求一次

fetch(url, {

method:'POST',

body: JSON.stringify(ajax.dataArr)

}).then(res=>res.json()).then(res=>{

event.emit('send', res);

})

},300);return new Promise((resolve, reject)=>{

event.on('send', (res) =>{

resolve(res.filter(item=>item.id == data.id)[0]);

});

})

}

4. 准备一个模拟json数据的 data.json 文件

[{"id": 1,"content": "文本内容11111"},{"id": 2,"content": "文本内容22222"},{"id": 3,"content": "文本内容33333"},{"id": 4,"content": "文本内容44444"},{"id": 5,"content": "文本内容55555"},{"id": 6,"content": "文本内容66666"},{"id": 7,"content": "文本内容77777"},{"id": 8,"content": "文本内容88888"}]

5.发送Ajax请求

for(let i = 1; i<=8; i++){

ajax('./data.json', {id: i}).then(res=>{

console.log(res);

})

}

6. 返回的数据

用Java语言编写ajax设计模式_使用JavaScript发布订阅设计模式实现Ajax请求节流相关推荐

  1. java语言编写简易表达式_将简单的表达语言放入Java

    小编典典 您可以看到如何传递所有参数: ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = m ...

  2. java写便签_如何编写一个便签程序(用Java语言编写)

    如何编写一个便签程序(用Java语言编写) 热度:336   发布时间:2011-02-18 11:44:16 如何编写一个便签程序(用Java语言编写) 因为以前没有好好学习Java,都搞忘了,请大 ...

  3. java语言编写计算器_第二次作业利用java语言编写计算器进行四则运算

    随着第一次作业的完成,助教 牛老师又布置了第二次作业:用java语言编写一个程序然后进行四则运算用户用键盘输入一个字符来结束程序显示统计结果.一开始看到这个题目我也着实吓了一跳 因为不知道如何下手而且 ...

  4. java语言开发手机游戏_手机上的JAVA游戏和JAVA软件,是电脑上的JAVA语言编写的吗?他们之间有什么联系...

    手机上的JAVA游戏和JAVA软件,是电脑上的JAVA语言编写的吗?他们之间有什么联系以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起 ...

  5. jdbc是java语言编写的类和接口_JDBC——Java语言连接数据库的标准

    JDBC概述 API JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Jav ...

  6. 用Java语言编写的随机彩色验证码

    在制作网页过程中,免不了在登录注册页面增加一个验证码来延长数据提交时间,以免大量用户过快连接数据库读取,写入数据导致服务器崩溃.以下是用Java语言编写的彩色验证码,可用于jsp.html文件. 源代 ...

  7. 使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网)

    使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网) 一,前期准备 1,Java IDE(Eclipse)与JDK的安装与配置 jdk-15.0.1-免配置路径版 提取码:earu 免 ...

  8. 利用Java语言编写一个猜数字游戏(有次数限制)

    猜数字小游戏. 利用Java语言编写. 题目: 用代码模拟猜数字的小游戏. 思路: 1.首先需要产生一个随机数字,并且一旦产生不再变化.用Random的nextInt方法 2.需要键盘输入,所以用到了 ...

  9. 第九届蓝桥杯省赛JAVA语言 C组题解_题7 缩位求和

    JAVA语言 C组题解_题7 缩位求和 题目 解题思路 题目 标题:缩位求和 在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确. 比如:248 * 15 = 3720 把乘数和被乘 ...

最新文章

  1. Jittor 的Op, Var算子
  2. Ymodem协议学习笔记
  3. 对Mapreduce代码进行单元测试
  4. 操作系统原理第四章:线程
  5. 安装补丁出现0xC8000222错误和系统日志中wuaueng.dll SUS20ClientDataStore 无法读取日志文件的错误...
  6. 设计一个算法找一条从迷宫入口到出口的最短路径。_我花了一夜用数据结构给女朋友写个H5走迷宫游戏...
  7. vue_prop单向数据流
  8. android权限 启动失败,Android 6.0打开失败:EACCES(权限被拒绝)
  9. java if else过多_Spring Boot中如何干掉过多的if else!
  10. Redis如何做内存优化?
  11. 荣耀Magic4性能体验超苹果再次实锤!非官方游戏性能对比出炉
  12. CentOS7--Firewalld防火墙
  13. 厂商服务器存储默认管理口登录信息 默认IP、用户名、密码
  14. win10系统QQ音乐安装包无法打开解决方法!
  15. 微型计算机每秒计算,微型计算机主要技术指标
  16. 点云粗配准之采样一致性
  17. 烂笔头 | OpenMMLab 第一讲
  18. scrapy框架下的豆瓣电影评论爬取以及登录,以及生成词云和柱状图
  19. Android.网络连接状态(联网,2g,3g,wifi等)
  20. 新型的火灾报警系统设有多个设备联动的模式,其能够服务于智能化以及化的火灾报警

热门文章

  1. 无损卡尔曼滤波UKF与多传感器融合
  2. Bi-level error correction for PacBio long reads
  3. 实验三:XML模型(一)
  4. Java枚举意义在哪_java – 多个if-else或枚举 – 哪一个更好,为什么?
  5. 朴素贝叶斯分类器和一般的贝叶斯分类器有什么区别
  6. java普通项目打包成exe可执行文件
  7. LeetCode 804 Unique Morse Code Words--python,java解法
  8. java bufferedwrite_Java BufferedWriter BufferedReader 源码分析
  9. C/C++学习笔记之指针体系
  10. python setdefault,Python笔记setdefault用法