当前位置:首页 > 日记 > 正文

自定义事件解决重复请求BUG的问题

自定义事件解决重复请求BUG的问题

现在,组件化开发还是比较流行的,毕竟其优点相当突出。最近在开发一个组件的时候,遇到了一个很有意思的BUG。。。

BUG的背景

最近在开发一个组件,好不容易开发好了转测试。然后,测试给我提了一个这样的bug,orz...

因为是一个组件,最大的好处就是可以随处复用,随处使用,然而,当一个页面用了多个组件,只有最后一个生效的时候,这个组件就没有什么意义了。。。

BUG原因查找

这个组件的初始数据来源的接口是固定的,也就是说,页面内的所有这个组件在初始化的时候都会发出同样的请求,这里的请求是jsonp的方式,所以回调函数是绑定在window上的一个函数,但是在页面中window只有一个,所以在回调处理的时候,要处理的组件内的相应的数据只指向最后一个组件。所以导致多个同样的组件在同一个页面中,只有最后一个组件能在取得数据之后顺利渲染出来。

BUG解决思路

最主要就是要将每次请求的callback存储起来,这样就可以保证callback中对组件数据的处理不是只指向最后一个。其次,既然是一样的请求,当然不希望会发出两次以上啦,即一个页面发出的每一个请求都是唯一的。

BUG解决方案

想到了发布订阅者模式的自定义事件,可以写这样的一个模块,每次请求发出前判断一下之前是否有相同的模块已经发出了,如果没有则缓存callback发出请求,如果有相同的请求已经发出了,那么检查一下这个发出的请求是否已经完成了,如果没有则继续缓存callback等待,如果请求已经发出并且已经完成则直接处理callback。在请求第一次回来后,发出广播,把之前缓存的callback都执行一次。

自定义事件详情

定义一个模块,里面有n个以回调函数命名的事件对象,每个对象有在被初始化的时候,定义其状态state,对应的callback数组,请求回到的数据data。每次调用该模块,首先检查对应的cbName是否被初始化,然后检查其state。根据state做相应的操作并改变state的值。state的值有3中,分别为init、loading、loaded。即初始化、请求中、请求完成。处于请求完成状态时才能执行相应的回调。

具体如下:

define('wq.getData', function (require, exports, module) {  var ls = require('loadJs');     var cache = {};  cache.init = function(cb,cbName,url){    if(!cache[cbName]){      cache[cbName] = {};      cache[cbName].state = 'init';      cache[cbName].cbs = [];      cache[cbName].data = [];    }    cache.on(cb,cbName,url);  }  cache.on = function(cb,cbName,url){    if(cache[cbName].state == 'loaded'){      cb(cache[cbName].data)    }else if(cache[cbName].state == 'loading'){      cache[cbName].cbs.push(cb)    }else if(cache[cbName].state == 'init'){      cache[cbName].cbs.push(cb);      cache[cbName].state = 'loading';      cache.fetch(cb,cbName,url);    }  }  cache.broadcast = function(cbName){    cache[cbName].cbs.forEach(function(cb){      cb(cache[cbName].data)    });  }  cache.checkLoaded = function(cbName){    if(cache[cbName].data[0]){      cache[cbName].state = 'loaded';      cache.broadcast(cbName);    }  }  cache.fetch = function(cb,cbName,url){    ls.loadScript({      url: url,      charset: 'utf-8',      handleError:function(func, args, context,errorObj){        console.log(_errlogText + context);        cache[cbName].data[0] = {};        cache.checkLoaded(cbName);      }    });    if(window.cbName) return;    window[cbName] = function(json){      cache[cbName].data[0] = json;      cache.checkLoaded(cbName);    }  }   exports.getData = function(cb,cbName,url){    cache.init(cb,cbName,url);  }  })

完美解决问题,每个回调都不会遗漏或者被覆盖……

扩展思路

该模块可通用于处理一个页面内同一个请求的情况。还可以扩展到处理一些需要2个请求以上完成才执行某个回调的情况。类似于Promose的情况。这个时候可以规定,每个data[0]装的是固定的对应接口的数据,data[2]对应另一个,一次类推。不过这样就要遍历到每一项都为true的时候才执行回调。而且对应关系比较容易混乱,再扩展就不如直接用Promise来处理了。。。

以上这篇自定义事件解决重复请求BUG的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

相关文章

微信小程序异步处理详解

微信小程序异步处理详解

异步处理,详解,程序,电脑软件,微信小,本文实例为大家分享了微信小程序异步处理的具体方法,供大家参考,具体内容如下直接看问题:然后看打印的结果:根据上面两图可以看出,代码上先执行的网络请求,再执行打印的变量,但是从下面打印的结果来看,先出结果…

解决ASP.NET Core Mvc文件上传限制

解决ASP.NET Core Mvc文件上传限制

文件上传,实例,电脑软件,NET,ASP,一、简介在ASP.NET Core MVC中,文件上传的最大上传文件默认为20MB,如果我们想上传一些比较大的文件,就不知道怎么去设置了,没有了Web.Config我们应该如何下手呢?二、设置上传文件大小1.应用程序级别设置我们需…

JS之if语句对接事件动作逻辑 | 详

JS之if语句对接事件动作逻辑 | 详

语句,事件,详解,逻辑,动作,if 函数的实现步骤:function +名字()指定id , 指定开关(display: none or block)if + else 构成逻辑 控制开关决定在哪里安置一个灯泡, 指定一个id给某个标签把开关用电线连着灯泡, 安装开关#+id名称{ 属性1= 赋值…

浅谈jquery中ajax跨域提交的时候会

浅谈jquery中ajax跨域提交的时候会

提交,请求,跨域,会有,浅谈,我们平时在同域中请求页面什么的时候不会有这种情况,这种情况大多发生在移动端的跨域请求中发生的。解决方法就是在服务端中加一层过滤HTTP请求的类型,把OPTION等不用的类型过滤掉。就是当请求为非HTTP中的 GET 和 …

JS库 Highlightjs 添加代码行号的

JS库 Highlightjs 添加代码行号的

行号,代码,电脑软件,JS,Highlightjs,Highlightjs是一款优秀的代码高亮Js组件,可以很方便地对各种语言编写的代码添加语法高亮样式。然而,Highlightjs默认是不包括显示代码行号(Line Number)这一特性的,不过可以通过简单的JS代码和CSS样式表实现…

painter怎么使用钢笔画笔绘制图形?

painter怎么使用钢笔画笔绘制图形?

绘制图形,电脑软件,painter,Painter绘制图形很简单,是一款很常用的绘图软件,今天我们就来看看painter中钢笔画笔的使用方法,请看下文详细介绍软件名称:Corel Painter(绘画软件) 2018 官方正式版(附注册机) 在线安装包 64位软件大小:994KB更新时…

excel表格斜杠绘制教程

excel表格斜杠绘制教程

绘制,教程,斜杠,表格,电脑软件,  Excel表格中如何绘制斜杠呢?下面是由小编分享的excel表格斜杠绘制教程,以供大家阅读和学习。excel表格斜杠绘制教程:  绘制斜杠步骤1:有时候,做表格需要给第一个格加斜杠,如下,绘制斜杠步骤2:选中要加斜杠的单…

Bootstrap栅格系统使用方法及页面

Bootstrap栅格系统使用方法及页面

变形,栅格系统,调整,解决方法,使用方法,如果你以前使用过Bootstrap2或者了解过响应式技术,那么肯定对Bootstrap栅格系统并不陌生,由于栅格系统的引入,使得Bootstrap的跨设备布局显示变得可能。什么是栅格系统栅格系统是指,将页面布局划分为等宽…

手机wps的ppt背景怎么编辑

手机wps的ppt背景怎么编辑

模板,方法,幻灯片,背景,编辑,  wps幻灯片的制作,怎么用手机去制作ppt呢?其实手机添加幻灯片模板和制作方法都很简单,关键是多学,下面给大家分享使用手机wps编辑幻灯片模板的方法,欢迎大家来到学习。手机wps添加幻灯片模板的方法wps添加幻灯片…

ps怎么制作一个膨胀文字的动画效果

ps怎么制作一个膨胀文字的动画效果

膨胀,动画效果,文字,电脑软件,ps,ps想要制作一段文字变形的动画,该怎么制作呢?下面我们就来看看ps制作文字膨胀效果的教程。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-041、首先启动Photoshop cs5,执行…

用Photoshop把一张裁剪出一个圆形

用Photoshop把一张裁剪出一个圆形

电脑软件,Photoshop,对图片进行裁剪很容易,有时我们直接截图就可以了,可是如果我们要截取一个圆形出来还是借用Photoshop来处理比较好,下面就为大家详细介绍一下,一起来看看吧!步骤:1、用Photoshop打开需要处理的照片,如图2、选择使用椭圆选框工具…

PS怎么设计一个淘宝无线端首页?

PS怎么设计一个淘宝无线端首页?

首页,淘宝,电脑软件,PS,无线端的店铺主页的教程,详细请看下文。软件名称:Adobe photoshop 6.0 汉化中文免费版软件大小:107MB更新时间:2013-04-191、新建一个空白的背景图层如所示大小2、利用圆角矩形工具画出如所示的矩形3、然后将这上面的一…