前两天在网上看到这一系列的文章《写一个JavaScript异步调用框架1,2,3,4,5,6》。
异步操作可能会产生你不希望的事件触发顺序。这个问题以前也遇到过,当时没想太多,也就是直接多层嵌套(在ajax返回以后嵌套下一个事件)来解决。
认真的看了一遍。看的头昏,不得不说我可能基础并不好,在大局上的掌握也不好。d反正我是觉得很难理解,也不觉得它的调用时够方便的。
如果是这么调用:
var chain = Async.go(0);
chain
.next(function(){setTimeout("alert(1)",3000)})
.next(function(){setTimeout("alert(2)",3000)})
.next(function(){setTimeout("alert(3)",3000)});
我觉得这样是完美的。但是实际上如果是异步调用却是要这样:
var chain = Async.go(0);
chain.next(function(){
var operation = new Async.Operation();
setTimeout(function(){ operation.yield("hello"); }, 3000);
return operation;
});
当然最后一篇提到再次封装一下,我想大致上就能解决这种不方便的调用了。
其实以前我也是有过这个念头,就是找一个能按我的顺序来触发的类或者什么,群里问问是否有这种类的时候,别人总都回句,在onreadychange里执行就好啦,甚至有嘲笑的!加上当时又是初学的菜鸟也便作罢了。而现在虽然依旧是菜鸟,但终究飞了一段路程了。就试试按自己的理解写一个事件队列吧。
我总习惯看代码说话,所以先上代码,然后说一下思路好了:
复制代码 代码如下:
/**
KEQueue —— Events Queue
@Author ake by 2010-04-25
http://www.cnblogs.com/akecn
@param data 事件队列中每个事件都会将该参数作为第一个参数传递下去,除非通过KEQueue.status修改它的值。
@method next(Function) 下一个要执行的事件。
@method wait(Number) 等待一定时间后执行下一个事件。
@method sleep() 停止事件序列的执行。
@method wake() 继续执行事件序列。
**/
var KEQueue = function(data) {
this.staticQueue = [];
this.asyncQueue = [];
this.status = "running";
this.result = data;
return this;
}
KEQueue.prototype = {
next:function(callback, async) {//添加一个方法
if(!!async) {
this.staticQueue.push("async");//如果是异步方法(会有延时效果的方法)就添加标识
this.asyncQueue.push(callback);//延时方法的存放数组
}else {
this.staticQueue.push(callback);//直接触发的方法的存放数组
}
return this;
},
wait:function(delay) {//延迟执行序列
var self = this;
this.next(function() {//模拟添加一个延时方法
setTimeout(function() {
self.wake.call(self)
}, delay);
},true);
return this;
},
go:function() {//按事件添加的先后顺序依次执行事件
if(this.staticQueue.length == 0) return;
while(this.staticQueue.length > 0) {
if(this.status === "sleep") return;
var fun = this.staticQueue.shift();
if(typeof fun == "string" && fun == "async") {
fun = this.asyncQueue.shift();
fun(this.result);
this.sleep();
}else {
fun(this.result);
}
}
},
sleep:function() {
this.status = "sleep";
},
wake:function() {
this.status = "running";
this.go();
}
}
估计你看了代码就已经明白是怎么做的了,代码也很简单。
其实就是循环去执行一个数组中的方法,如果数组中存放的不是function,就停止队列的操作直到被叫醒(wake())。使用方法也比较偏向我喜欢的方式。
当然也许我只是看到事件是按我添加的顺序去执行了,但有很多其他的情况或者原因没想到。如果您有建议或者意见,欢迎留言!
以下是使用示例。
复制代码 代码如下:
//示例1 添加事件、执行事件队列
function show(n) {
console.log(n);
}
var o = new KEQueue("0");
o.next(function(d) { //参数是构造时传递的数据。整个事件队列都会返回该数据作为参数。
show(d + 1);
}).next(function(d) {
setTimeout(function() { //模拟延时操作(异步操作)
show(d + 2);
o.result = 0; //更改用以传递的数据,如果不修改,该数据会保持一致一直传递到最后一个事件。
o.wake(); //需要手动唤醒序列
},2000);
},true).next(function(d){
show(d + 3);
}).go();
o.next(function(d) {
setTimeout(function() {show(d + 4);o.wake(); },1000);
},true).wait(1000) //手动推迟1秒执行下面的方法
.next(function(d) {
show(d + 5);
}).go();
//示例2
o.next(function() {
show(1);
})
setTimeout(function() {
o.next(function(){
setTimeout(function() {
show(2);
o.wake();
},2000)
},true).go();
},1000);
setTimeout(function() {
o.next(function() {
show(3);
}).go();
},2000);
PS:晚上睡觉的时候突然想说如果添加的是一个复杂事件,那么所消耗的时间久长了,这样会不会造成不期望的事件顺序呢?如果这样每个事件最后都要显示当做异步事件去处理,那这个队列就没什么大的意义了,最多就是帮你梳理一下事件顺序,仅此而已了。。
早上去公司路上又突然想起,JavaScript是单线程操作的哎,事件会被阻塞的,如果是多线程,估计也不需要做这么个队列了。
刚才写个demo试了一下恩,看来还是没问题的。
相关推荐:
优化工具:提升工作效率的秘密武器,网站模板的优化策略是什么
ChatGPT360:全方位提升你的工作与生活效率,ai72787
AI免费生成文字,打造创作新时代
未来写作新方式原创AI文章的无限可能
AI智能软件:未来科技的核心力量
WPJVX:开启数字化未来的智慧平台,关键词排名技术咨询乐云seo
ChatGPT在处理文本时可能无法完全理解上下文的复杂性,肌肉ai
“多网建站”助力企业跨越发展,开启全新数字化时代,海南网站优化电池
洗文章AI:让内容创作变得更智能、更高效
什么是神马排名?让你的网站脱颖而出,轻松占据搜索引擎的C位!,乳山网站优化关键词排名
seo监控什么意思,seo数据监控 ,ai panda眼镜架
ChatGPT服务部分恢复:人工智能助力全新体验,ai对象菜单
GPT在什么时候被人熟知的?从技术突破到广泛应用的背后故事,ai商业新思维ai课程
ChatGPT:基于Transformer技术的语言模型,开创人工智能未来,AI独战OK
人工AI软件的未来:智能时代的创新驱动力
在线AI写文:开启高效创作新时代
WP原创:打造属于你的独特网站,从这里开始!,一个网站推广一个月需要多少钱
ChatGPT中文版下载免费版:智能对话新时代,尽在,ai光波
seo深度优化插件是什么,深度优化手机软件 ,ai的缩写
seo辅助词选什么,seo助手 ,各车企ai
seo需要什么人才,seo需要做什么工作 ,探索ai照片
AI网页版智能问答,开启智慧沟通新时代,ai梦境档案用不了手柄
优化分析:提升企业效益的关键策略,山东大网站建设
SEO搜索关键词是什么意思?全方位解析关键词优化的核心要素,lol ai图片
优化平台:让数字化转型更简单、更高效,莆田谷歌seo品牌排行
GPT哪个模型是最新的?AI语言生成的未来,ai回头
seo进阶买什么书运营,seo入门难吗 ,没有ai软件怎么打开ai图片
SEO有意:如何通过优化策略提升网站排名与流量,天津政府智慧网站建设
用AI生成文章,让创作更简单高效
为什么要监控SEO效果,国家为什么要监控个人 ,抚顺ai系统
SEO短视:为何眼前的成效不能成为长久的策略?,网站上线seo优化
优化原理:提升效率、创新突破的核心法则,印刷包装推广有哪里网站
Chatget免费网站版无需登录,畅享无限对话体验!,工业 Ai 视觉检测
SEO无限:如何利用SEO技术实现网站流量爆发?,网站建设总监
GPT怎么收费?揭秘AI技术的定价与价值,ai报考高考
企业如何借助SEO咨询实现精准流量引爆,助力业绩提升,立刻推广的旅游线下营销
seo网赚什么意思,网站seo赚钱 ,ai打不开ai
OpenAI新产品与现有技术的完美结合:赋能未来的智能变革,培训 ai
ChatGPT为什么打不开?背后原因与解决方案,慧ai写作
ChatGPT坏了用什么?替代方案,满足你的智能对话需求,星际一的ai
ChatGPT:OpenAI的创新之作-一款颠覆传统的语言模型,ai球衣号
优化公司:助力企业腾飞的秘密武器,微信营销推广价格多少
ChatGPTWindows版本下载:让AI助力您的工作和生活,ai yamama
SEO目的:如何通过精准优化提高网站流量与转化率,百度推广网站关键词
SEO重要性与企业互联网发展的必由之路,互联网营销推广平台设计
SEO表格:优化网站排名的秘密武器,大数据推广营销费用多少
SEO检测,让网站排名飞升的秘密武器,高端快消食品营销推广
优化*:打造更加高效、创新的娱乐体验,石排网站建设制作多少钱
文章AI思维导图自动生成助力创作的智慧之源
中外链:打通全球流量的桥梁,提升网站排名与流量的双重保障,行业网站建设思路