[js高手之路]javascript腾讯面试题学习封装一个简易的异步队列
这道js的面试题,是这样的,页面上有一个按钮,一个ul,点击按钮的时候,每隔1秒钟向ul的后面追加一个li, 一共追加10个,li的内容从0开始计数( 0, 1, 2, ....9 ),首先我们用闭包封装一个创建li元素的函数.
var create = (function(){
var count = 0;
return function(){
var oLi = document.createElement( "li" );
oLi.innerHTML = count++;
return oLi;
}
})();
页面上的2个元素:
var oBtn = document.querySelector( "input" );
var oBox = document.querySelector( "#box" ); var create = (function(){
var count = 0;
return function(){
var oLi = document.createElement( "li" );
oLi.innerHTML = count++;
return oLi;
}
})(); oBtn.onclick = function(){
setTimeout(function(){
oBox.appendChild( create() );
setTimeout( function(){
oBox.appendChild( create() );
setTimeout( function(){
oBox.appendChild( create() );
}, 1000 );
}, 1000 );
}, 1000 );
}
点击按钮的时候,用回调函数嵌套方式,这里我加入3个li,就已经快受不了了,这就是javascript著名的回调地狱,那么在这里,我用循环简化一下:
var oBtn = document.querySelector("input");
var oBox = document.querySelector("#box");
var timer = oNode = null;
var create = (function () {
var count = 0;
return function () {
var oLi = document.createElement("li");
oLi.innerHTML = count++;
return oLi;
}
})();
function add(){
oNode = oBox.appendChild( create() );
if ( oNode.innerHTML < 9 ) {
timer = setTimeout( add, 1000 );
}else {
clearTimeout( timer );
}
}
oBtn.onclick = function () {
add();
}
恩,确实简化了,但是这种面向过程的方式,耦合性太强,下面呢,我就把这个封装成一个通用队列
第一步:封装一个队列,包含( 入列,出列),队列的特点(先进先出,如果你不懂这个,需要去补下基本的数据结构与算法内容)
var Queue = function () {
this.list = []
}
Queue.prototype = {
constructor: Queue,
enQueue: function ( fn ) {
this.list.push( fn );
return this;
},
deQueue: function () {
var fn = this.list.shift() || function () {};
fn.apply( this, arguments );
}
}
我们来使用它:
var oQ = new Queue();
oQ.enQueue( function(){
console.log( 'ghostwu1' );
}).enQueue( function(){
console.log( 'ghostwu2' );
}).enQueue( function(){
console.log( 'ghostwu3' );
}).deQueue();
while( oQ.list.length ){
oQ.deQueue();
}
第二步、虽然我们现在实现了一个队列,但是,这玩意是同步的,接下来继续改造成异步的:
var oQ = new Queue();
oQ.enQueue( function(){
var _this = this;
console.log( 'ghostwu1' );
setTimeout( function(){ _this.deQueue(); }, 1000 );
}).enQueue( function(){
var _this = this;
console.log( 'ghostwu2' );
setTimeout( function(){ _this.deQueue(); }, 1000 );
}).enQueue( function(){
var _this = this;
console.log( 'ghostwu3' );
setTimeout( function(){ _this.deQueue(); }, 1000 );
}).deQueue();
第三步、这样就实现了一个异步队列, 这里有个小东西要注意下,把this保存下来,因为定时器的this指向的是window.另外在封装deQueue(出列)函数时,一定要给个空函数,否则出列完了之后,会报错,但是这玩意还是有耦合性,继续改造:
<input type="button" value="点我">
<ul id="box"></ul>
<script>
var Utils = {
isFunction: function (a) {
return Object.prototype.toString.call(a) === '[object Function]';
},
isNumber: function (a) {
return typeof a === 'number';
}
};
var Queue = function () {
this.list = []
}
Queue.prototype = {
constructor: Queue,
enQueue: function (fn) {
this.list.push(fn);
return this;
},
delay: function (time) {
this.list.push(time);
return this;
},
deQueue: function () {
var _this = this;
var cur = this.list.shift() || function () { };
if (Utils.isFunction(cur)) {
cur.apply(_this, arguments);
if (_this.list.length) _this.deQueue();
} else if (Utils.isNumber(cur)) {
setTimeout(function () {
_this.deQueue();
}, cur);
}
}
} var oBtn = document.querySelector("input");
var oBox = document.querySelector("#box");
var create = (function () {
var count = 0;
return function () {
var oLi = document.createElement("li");
oLi.innerHTML = count++;
return oLi;
}
})();
oBtn.onclick = function () {
var oQ = new Queue();
function add() {
for (var i = 0; i < 10; i++) {
oQ.enQueue(function () {
oBox.appendChild(create());
}).delay(1000);
}
}
add();
oQ.deQueue();
}
</script>
这样封装之后,我们的异步队列就变得通用一点了,把延时和业务逻辑分开处理
[js高手之路]javascript腾讯面试题学习封装一个简易的异步队列的更多相关文章
- [js高手之路] javascript面向对象写法与应用
一.什么是对象? 对象是n个属性和方法组成的集合,如js内置的document, Date, Regexp, Math等等 document就是有很多的属性和方法, 如:getElementById, ...
- [js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist
promise主要是用来解决异步回调问题,其实还有好几种比promise更好的方案,后面再说,这节,我们先用promise来改造下,我以前写的一篇文章[js高手之路]javascript腾讯面试题学习 ...
- [js高手之路]html5 canvas动画教程 - 自己动手做一个类似windows的画图软件
这个绘图工具,我还没有做完,不过已经实现了总架构,以及常见的简易图形绘制功能: 1,可以绘制直线,圆,矩形,正多边形[已完成] 2,填充颜色和描边颜色的选择[已完成] 3,描边和填充功能的选择[已完成 ...
- [js高手之路]从原型链开始图解继承到组合继承的产生
基于javascript原型链的层层递进查找规则,以及原型对象(prototype)的共享特性,实现继承是非常简单的事情 一.把父类的实例对象赋给子类的原型对象(prototype),可以实现继承 f ...
- [js高手之路]原型对象(prototype)与原型链相关属性与方法详解
一,instanceof: instanceof检测左侧的__proto__原型链上,是否存在右侧的prototype原型. 我在之前的两篇文章 [js高手之路]构造函数的基本特性与优缺点 [js高手 ...
- [js高手之路]设计模式系列课程-发布者,订阅者重构购物车
发布者订阅者模式,是一种很常见的模式,比如: 一.买卖房子 生活中的买房,卖房,中介就构成了一个发布订阅者模式,买房的人,一般需要的是房源,价格,使用面积等信息,他充当了订阅者的角色 中介拿到卖主的房 ...
- [js高手之路]Node.js实现简易的爬虫-抓取博客文章列表信息
抓取目标:就是我自己的博客:http://www.cnblogs.com/ghostwu/ 需要实现的功能: 抓取文章标题,超链接,文章摘要,发布时间 需要用到的库: node.js自带的http库 ...
- [js高手之路]Node.js+jade+mongoose实战todolist(分页,ajax编辑,删除)
该系列文章索引: [js高手之路]node js系列课程-创建简易web服务器与文件读写 [js高手之路]node js系列课程-图解express+supervisor+ejs用法 [js高手之路] ...
- [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)
关于promise我在之前的文章已经应用过好几次,如[js高手之路]Node.js+jade+express+mongodb+mongoose+promise实现todolist,本文就来讲解下pro ...
随机推荐
- javascript中的闭包(Closure)的学习
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面是我在网上通过学习阮一峰老师的笔记,感觉总结很不错,特记录于此. 一.变量的作用域 要理解 ...
- idea项目上传到码云
从idea托管项目到码云相对其他软件来说是非常简单的,只要第一次下载好git插件,然后托管如下: 1. 2. 3.登陆成功后,默认会将项目所有项全选,托管成功后右下角会显示 4.当以后项目有变化时再如 ...
- 云计算——Google App Eng…
云计算--Google App Engine(一) 编者:王尚 2014.04.12 20:20 介绍:Google App Engine提供一套开发组件让用户轻松的在本地构建和调试网络应用,之后能让 ...
- 最小生成树详解 prim+ kruskal代码模板
最小生成树概念: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里 ...
- Python Socket 简单聊天室1
这是第一版,最简单的,仅仅实现了通信,你收我发,我收你发而已.下篇将介绍,基于异步多线程的聊天室: 客户端: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...
- 关于Wifi室内定位应用中的一些问题:
公司目前在办公室内布设了一套室内定位的实验环境,用的是华为路由器,采用的算法是基于信号强度的RSSI算法.公司目前希望能使用这套设备得到无线网络覆盖范围下的所有移动设备(对应每个人)的MAC地址,同时 ...
- 敏捷开发之产品日日新,一步通之---自动化代码构建->自动化打包->自动化安装部署
本文将介绍如何自动化实现代码构建,自动化代码打包成exe安装包,自动化安装到测试环境.通过计划任务的方式,每天自动化发布最新的产品供老板展示,供测试人员使用,真正实现敏捷的快速迭代. 自动代码构建 自 ...
- 今天出现了一个问题,Tomcat 进入localhost:8080正常,进入项目内别的页面都是空白页
经仔细检查发现代码没有任何的问题,经仔细检查找到了原因. 问题原因:拦截器(过滤器)把我的访问请求全都拦下了,我在拦截器里把//chain.doFilter(request, response);这行 ...
- 手工释放linux内存——/proc/sys/vm/drop_caches
--手工释放linux内存——/proc/sys/vm/drop_caches 总有很多朋友对于Linux的内存管理有疑问,之前一篇日志似乎也没能清除大家的疑虑.而在新版核心中,似乎对这个问题提供了新 ...
- Oracle联机日志损坏解决办法
关于此问题,在网上找到一篇不错的文章. 大家都清楚,联机日志分为当前联机日志和非当前联机日志. ---------------------------------------------------- ...