亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

js下寫一個(gè)事件隊(duì)列操作函數(shù)

 更新時(shí)間:2010年07月19日 00:28:09   作者:  
異步操作可能會(huì)產(chǎn)生你不希望的事件觸發(fā)順序。這個(gè)問題以前也遇到過,當(dāng)時(shí)沒想太多,也就是直接多層嵌套(在ajax返回以后嵌套下一個(gè)事件)來解決。
前兩天在網(wǎng)上看到這一系列的文章《寫一個(gè)JavaScript異步調(diào)用框架1,2,3,4,5,6》。

異步操作可能會(huì)產(chǎn)生你不希望的事件觸發(fā)順序。這個(gè)問題以前也遇到過,當(dāng)時(shí)沒想太多,也就是直接多層嵌套(在ajax返回以后嵌套下一個(gè)事件)來解決。

認(rèn)真的看了一遍??吹念^昏,不得不說我可能基礎(chǔ)并不好,在大局上的掌握也不好。d反正我是覺得很難理解,也不覺得它的調(diào)用時(shí)夠方便的。

   如果是這么調(diào)用:

var chain = Async.go(0);
chain
.next(function(){setTimeout("alert(1)",3000)})
.next(function(){setTimeout("alert(2)",3000)})
.next(function(){setTimeout("alert(3)",3000)});

我覺得這樣是完美的。但是實(shí)際上如果是異步調(diào)用卻是要這樣:

var chain = Async.go(0);
chain.next(function(){
var operation = new Async.Operation();
setTimeout(function(){ operation.yield("hello"); }, 3000);
return operation;
});

當(dāng)然最后一篇提到再次封裝一下,我想大致上就能解決這種不方便的調(diào)用了。



其實(shí)以前我也是有過這個(gè)念頭,就是找一個(gè)能按我的順序來觸發(fā)的類或者什么,群里問問是否有這種類的時(shí)候,別人總都回句,在onreadychange里執(zhí)行就好啦,甚至有嘲笑的!加上當(dāng)時(shí)又是初學(xué)的菜鳥也便作罷了。而現(xiàn)在雖然依舊是菜鳥,但終究飛了一段路程了。就試試按自己的理解寫一個(gè)事件隊(duì)列吧。

我總習(xí)慣看代碼說話,所以先上代碼,然后說一下思路好了:
復(fù)制代碼 代碼如下:

/**
KEQueue —— Events Queue
@Author ake by 2010-04-25
http://www.cnblogs.com/akecn

@param data 事件隊(duì)列中每個(gè)事件都會(huì)將該參數(shù)作為第一個(gè)參數(shù)傳遞下去,除非通過KEQueue.status修改它的值。
@method next(Function) 下一個(gè)要執(zhí)行的事件。
@method wait(Number) 等待一定時(shí)間后執(zhí)行下一個(gè)事件。
@method sleep() 停止事件序列的執(zhí)行。
@method wake() 繼續(xù)執(zhí)行事件序列。
**/
var KEQueue = function(data) {
this.staticQueue = [];
this.asyncQueue = [];
this.status = "running";
this.result = data;
return this;
}
KEQueue.prototype = {
next:function(callback, async) {//添加一個(gè)方法
if(!!async) {
this.staticQueue.push("async");//如果是異步方法(會(huì)有延時(shí)效果的方法)就添加標(biāo)識(shí)
this.asyncQueue.push(callback);//延時(shí)方法的存放數(shù)組
}else {
this.staticQueue.push(callback);//直接觸發(fā)的方法的存放數(shù)組
}
return this;
},
wait:function(delay) {//延遲執(zhí)行序列
var self = this;
this.next(function() {//模擬添加一個(gè)延時(shí)方法
setTimeout(function() {
self.wake.call(self)
}, delay);
},true);
return this;
},
go:function() {//按事件添加的先后順序依次執(zhí)行事件
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();
}
}

估計(jì)你看了代碼就已經(jīng)明白是怎么做的了,代碼也很簡單。

其實(shí)就是循環(huán)去執(zhí)行一個(gè)數(shù)組中的方法,如果數(shù)組中存放的不是function,就停止隊(duì)列的操作直到被叫醒(wake())。使用方法也比較偏向我喜歡的方式。

當(dāng)然也許我只是看到事件是按我添加的順序去執(zhí)行了,但有很多其他的情況或者原因沒想到。如果您有建議或者意見,歡迎留言!

以下是使用示例。
復(fù)制代碼 代碼如下:

//示例1 添加事件、執(zhí)行事件隊(duì)列
function show(n) {
console.log(n);
}
var o = new KEQueue("0");
o.next(function(d) { //參數(shù)是構(gòu)造時(shí)傳遞的數(shù)據(jù)。整個(gè)事件隊(duì)列都會(huì)返回該數(shù)據(jù)作為參數(shù)。
show(d + 1);
}).next(function(d) {
setTimeout(function() { //模擬延時(shí)操作(異步操作)
show(d + 2);
o.result = 0; //更改用以傳遞的數(shù)據(jù),如果不修改,該數(shù)據(jù)會(huì)保持一致一直傳遞到最后一個(gè)事件。
o.wake(); //需要手動(dòng)喚醒序列
},2000);
},true).next(function(d){
show(d + 3);
}).go();

o.next(function(d) {
setTimeout(function() {show(d + 4);o.wake(); },1000);
},true).wait(1000) //手動(dòng)推遲1秒執(zhí)行下面的方法
.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:晚上睡覺的時(shí)候突然想說如果添加的是一個(gè)復(fù)雜事件,那么所消耗的時(shí)間久長了,這樣會(huì)不會(huì)造成不期望的事件順序呢?如果這樣每個(gè)事件最后都要顯示當(dāng)做異步事件去處理,那這個(gè)隊(duì)列就沒什么大的意義了,最多就是幫你梳理一下事件順序,僅此而已了。。

早上去公司路上又突然想起,JavaScript是單線程操作的哎,事件會(huì)被阻塞的,如果是多線程,估計(jì)也不需要做這么個(gè)隊(duì)列了。

剛才寫個(gè)demo試了一下恩,看來還是沒問題的。

相關(guān)文章

  • js實(shí)現(xiàn)簡單計(jì)算器

    js實(shí)現(xiàn)簡單計(jì)算器

    一個(gè)簡潔的網(wǎng)頁JS計(jì)算器,附詳細(xì)代碼釋義。通過下邊的效果演示就可以看到,這是一個(gè)挺小的js網(wǎng)頁計(jì)算器,界面美化的我想還是不錯(cuò)的,畢竟在沒有使用任何圖片修飾的情況下,很好看,而且功能挺實(shí)用,可以完成基本的數(shù)學(xué)算數(shù)運(yùn)算。
    2015-11-11
  • 詳解webpack和webpack-simple中如何引入css文件

    詳解webpack和webpack-simple中如何引入css文件

    這篇文章主要介紹了詳解webpack和webpack-simple中如何引入css文件,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-06-06
  • JavaScript控制語句及搭建前端服務(wù)器的過程詳解

    JavaScript控制語句及搭建前端服務(wù)器的過程詳解

    這篇文章主要介紹了JavaScript控制語句及搭建前端服務(wù)器,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • JavaScript架構(gòu)前端不能沒有監(jiān)控系統(tǒng)原因

    JavaScript架構(gòu)前端不能沒有監(jiān)控系統(tǒng)原因

    這篇文章主要為大家介紹了為什么前端不能沒有監(jiān)控系統(tǒng)的原因,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • javascript實(shí)現(xiàn)雪花飄落效果

    javascript實(shí)現(xiàn)雪花飄落效果

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)雪花飄落效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • JavaScript 中的輸出數(shù)據(jù)多種方式

    JavaScript 中的輸出數(shù)據(jù)多種方式

    在 JavaScript 中,不像 Java 等語言,它沒有任何打印或者輸出方法的,在js中通過使用4種方式來輸出數(shù)據(jù),本文通過實(shí)例代碼給大家詳細(xì)介紹,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • javascript 精確獲取樣式屬性(下)

    javascript 精確獲取樣式屬性(下)

    繼續(xù)上一部分,我們要看一下顏色?;鸷孟癫还苋叨欢紩?huì)轉(zhuǎn)變?yōu)閞gb格式,不過我們通常比較習(xí)慣的是hex格式。這就用到以下兩函數(shù)。
    2010-01-01
  • JavaScript SHA512加密算法詳細(xì)代碼

    JavaScript SHA512加密算法詳細(xì)代碼

    這篇文章主要為大家詳細(xì)介紹了JavaScript SHA512加密算法代碼,具有一定的參考價(jià)值,感興趣的朋友可以參考一下
    2016-10-10
  • ?JavaScript?數(shù)據(jù)結(jié)構(gòu)之散列表的創(chuàng)建(2)

    ?JavaScript?數(shù)據(jù)結(jié)構(gòu)之散列表的創(chuàng)建(2)

    這篇文章主要介紹了?JavaScript?數(shù)據(jù)結(jié)構(gòu)之散列表的創(chuàng)建,主要看如何處理散列值沖突的問題,并實(shí)現(xiàn)更完美的散列表。下文詳細(xì)介紹需要的小伙伴可以參考一下
    2022-04-04
  • javascript彈出頁面回傳值的方法

    javascript彈出頁面回傳值的方法

    這篇文章主要介紹了javascript彈出頁面回傳值的方法,實(shí)例分析了由a1.html彈出的b1.html回傳值的實(shí)現(xiàn)方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-01-01

最新評(píng)論