<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        js下寫一個事件隊列操作函數(shù)_javascript技巧

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 20:54:14
        文檔

        js下寫一個事件隊列操作函數(shù)_javascript技巧

        js下寫一個事件隊列操作函數(shù)_javascript技巧:前兩天在網(wǎng)上看到這一系列的文章《寫一個JavaScript異步調(diào)用框架1,2,3,4,5,6》。 異步操作可能會產(chǎn)生你不希望的事件觸發(fā)順序。這個問題以前也遇到過,當(dāng)時沒想太多,也就是直接多層嵌套(在ajax返回以后嵌套下一個事件)來解決。 認(rèn)真的看了一遍。看的頭昏,
        推薦度:
        導(dǎo)讀js下寫一個事件隊列操作函數(shù)_javascript技巧:前兩天在網(wǎng)上看到這一系列的文章《寫一個JavaScript異步調(diào)用框架1,2,3,4,5,6》。 異步操作可能會產(chǎn)生你不希望的事件觸發(fā)順序。這個問題以前也遇到過,當(dāng)時沒想太多,也就是直接多層嵌套(在ajax返回以后嵌套下一個事件)來解決。 認(rèn)真的看了一遍。看的頭昏,

        前兩天在網(wǎng)上看到這一系列的文章《寫一個JavaScript異步調(diào)用框架1,2,3,4,5,6》。

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

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

           如果是這么調(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)});

        我覺得這樣是完美的。但是實際上如果是異步調(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)用了。

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

        我總習(xí)慣看代碼說話,所以先上代碼,然后說一下思路好了:
        代碼如下:
        /**
        KEQueue —— Events Queue
        @Author ake by 2010-04-25
        http://www.cnblogs.com/akecn

        @param data 事件隊列中每個事件都會將該參數(shù)作為第一個參數(shù)傳遞下去,除非通過KEQueue.status修改它的值。
        @method next(Function) 下一個要執(zhí)行的事件。
        @method wait(Number) 等待一定時間后執(zhí)行下一個事件。
        @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) {//添加一個方法
        if(!!async) {
        this.staticQueue.push("async");//如果是異步方法(會有延時效果的方法)就添加標(biāo)識
        this.asyncQueue.push(callback);//延時方法的存放數(shù)組
        }else {
        this.staticQueue.push(callback);//直接觸發(fā)的方法的存放數(shù)組
        }
        return this;
        },
        wait:function(delay) {//延遲執(zhí)行序列
        var self = this;
        this.next(function() {//模擬添加一個延時方法
        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īng)明白是怎么做的了,代碼也很簡單。

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

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

        以下是使用示例。
        代碼如下:
        //示例1 添加事件、執(zhí)行事件隊列
        function show(n) {
        console.log(n);
        }
        var o = new KEQueue("0");
        o.next(function(d) { //參數(shù)是構(gòu)造時傳遞的數(shù)據(jù)。整個事件隊列都會返回該數(shù)據(jù)作為參數(shù)。
        show(d + 1);
        }).next(function(d) {
        setTimeout(function() { //模擬延時操作(異步操作)
        show(d + 2);
        o.result = 0; //更改用以傳遞的數(shù)據(jù),如果不修改,該數(shù)據(jù)會保持一致一直傳遞到最后一個事件。
        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秒執(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:晚上睡覺的時候突然想說如果添加的是一個復(fù)雜事件,那么所消耗的時間久長了,這樣會不會造成不期望的事件順序呢?如果這樣每個事件最后都要顯示當(dāng)做異步事件去處理,那這個隊列就沒什么大的意義了,最多就是幫你梳理一下事件順序,僅此而已了。

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

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

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        js下寫一個事件隊列操作函數(shù)_javascript技巧

        js下寫一個事件隊列操作函數(shù)_javascript技巧:前兩天在網(wǎng)上看到這一系列的文章《寫一個JavaScript異步調(diào)用框架1,2,3,4,5,6》。 異步操作可能會產(chǎn)生你不希望的事件觸發(fā)順序。這個問題以前也遇到過,當(dāng)時沒想太多,也就是直接多層嵌套(在ajax返回以后嵌套下一個事件)來解決。 認(rèn)真的看了一遍。看的頭昏,
        推薦度:
        標(biāo)簽: 操作 事件 js
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲成A人片在线观看无码不卡 | 99视频在线精品免费| 亚洲成av人在片观看| 精品国产亚洲AV麻豆| 日本不卡高清中文字幕免费| 亚洲欧美国产国产综合一区| 国产免费拔擦拔擦8x| 国内精品免费久久影院| 亚洲精品成人久久久| 一级A毛片免费观看久久精品 | 亚洲AV无码国产精品永久一区| 成人爽A毛片免费看| 亚洲AV无码专区亚洲AV桃| 免费一级做a爰片性色毛片| 亚洲天天做日日做天天看| 久草免费手机视频| 亚洲女人影院想要爱| 成人黄软件网18免费下载成人黄18免费视频| 亚洲人成日本在线观看| 国产成人精品123区免费视频| 黄色免费在线网址| 无限动漫网在线观看免费| 亚洲欧洲精品成人久久曰| 国产一区二区视频免费| 国产福利在线观看永久免费| 亚洲Av无码精品色午夜| 免费人成网站在线观看10分钟| 亚洲依依成人亚洲社区| 真人做人试看60分钟免费视频| 日韩亚洲产在线观看| 色播精品免费小视频| 亚洲中文字幕无码av永久| 亚洲国产黄在线观看| 久久久久久久99精品免费| 亚洲妇女熟BBW| 国产AV无码专区亚洲AWWW| 最近新韩国日本免费观看| 亚洲日韩精品A∨片无码加勒比| 国产亚洲AV夜间福利香蕉149| 成年人免费的视频| 国产福利在线观看永久免费|