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

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

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

    認真的看了一遍。看的頭昏,不得不說我可能基礎(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返回以后嵌套下一個事件)來解決。 認真的看了一遍。看的頭昏,
    推薦度:
    標(biāo)簽: 操作 事件 js
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 少妇人妻偷人精品无码视频 | 国产区精品高清在线观看| 亚洲国产综合精品一区在线播放| 亚洲欧美日韩精品| 99精品无人区乱码在线观看 | 国产精品嫩草影院一二三区| 国产精品无码无需播放器| 亚洲精品动漫人成3d在线| 99精品免费视品| 亚洲精品乱码久久久久久不卡| 99久久成人国产精品免费 | 国产A级毛片久久久精品毛片| japanese乱人伦精品| 久久久精品2019免费观看| 亚洲精品乱码久久久久久不卡| 精品欧美小视频在线观看| 国产精品免费久久久久影院 | 欧美精品/日韩精品/国产精品| 国产成人精品免费视频动漫| 精品欧洲av无码一区二区三区| 亚洲Av无码精品色午夜| 亚洲精品成人片在线播放| 亚洲精品乱码久久久久久| 亚洲精品无码99在线观看| 一本色道久久88综合日韩精品 | 国模精品一区二区三区| 国产三级国产精品国产普男人 | 996久久国产精品线观看| 精品人妻中文字幕有码在线| 久久精品亚洲一区二区三区浴池| 老司机亚洲精品影院无码| 久久er99热精品一区二区| 国产亚洲精品岁国产微拍精品| 久久99国产综合精品| 国产综合精品一区二区三区| 91精品国产色综合久久| 国产高清在线精品一区| 久久精品免费一区二区三区| 国产成人高清精品免费观看| 精品国产人成亚洲区| 亚洲国产小视频精品久久久三级|