異步操作可能會產生你不希望的事件觸發順序。這個問題以前也遇到過,當時沒想太多,也就是直接多層嵌套(在ajax返回以后嵌套下一個事件)來 " /> 免费看黄在线观看,欧美激情一区二区三区,h小视频在线

一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

js下寫一個事件隊列操作函數

前兩天在網上看到這一系列的文章《寫一個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試了一下恩,看來還是沒問題的。

JavaScript技術js下寫一個事件隊列操作函數,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产精品露脸国语对白手机视频 | 伊人久久综合网站 | 欧美透逼| 国产在线精品国自产拍影院同性 | 91看片在线观看 | 久久久国产精品网站 | 国产区在线免费观看 | 成人网页| 一区二区三区免费视频网站 | 美女网站色视频 | 国产精品视频牛仔裤一区 | 日本综合欧美一区二区三区 | 亚洲欧美一区二区久久 | 亚洲综合图片人成综合网 | 国产精品成人免费综合 | 97色婷婷成人综合在线观看 | 久久99中文字幕伊人 | 亚洲欧美日韩国产色另类 | 久久久久久久成人午夜精品福利 | 国产一区三区二区中文在线 | 精品久久精品久久 | 欧美日本高清一本二本三本 | 337p日本大胆欧美人术艺术精品 | 亚洲最大视频网 | 91久色视频 | 男女免费爽爽爽在线视频 | 色中文网 | 一色屋成人免费精品网 | 中文字幕第一页在线视频 | 欧美亚洲国产人成aaa | 国产精品 主播精选 网红 | 开心久久激情 | 爽妇网国产精品 | 国产亚洲精品成人a在线 | 欧美7777kkkk免费看258 | 国内精品久久久久久久星辰影视 | 婷婷丁香花麻豆 | 免费人成在线蜜桃视频 | 国产一区二区在免费观看 | 欧美亚洲视频 | 91视频麻豆 |