• <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返回以后嵌套下一個事件)來解決。 認(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
    主站蜘蛛池模板: 99在线热播精品免费99热| 国产区精品高清在线观看| 国产成人精品福利网站在线观看| 国产成人无码久久久精品一 | 国产精品男男视频一区二区三区| 桃花岛精品亚洲国产成人| 国产精品99久久精品| 国产成人精品免费午夜app | 四虎国产精品成人免费久久| 亚洲福利精品电影在线观看| 亚洲色精品88色婷婷七月丁香| 色国产精品一区在线观看| 国产成人精品一区二区秒拍| 中文字幕精品一区二区三区视频| 国产美女久久精品香蕉69| 久久久久久久99精品免费观看| 国产精品 猎奇 另类视频| 国产精品99精品无码视亚| 亚洲一级Av无码毛片久久精品 | 99re66热这里只有精品| 四虎成人精品无码| 亚洲日韩精品一区二区三区 | 女人高潮内射99精品| 亚洲精品国产av成拍色拍| 潮喷大喷水系列无码久久精品| 亚洲嫩草影院久久精品| 国产精品一二二区| 97久久超碰国产精品2021| 久久国产精品一国产精品金尊| 九九99精品久久久久久| 免费精品国自产拍在线播放| 国产精品成人一区二区| 99熟女精品视频一区二区三区| 久久最新精品国产| 亚洲国产精品久久久久婷婷软件 | 精品国产a∨无码一区二区三区| 精品无人区一区二区三区| 久久精品人人做人人爽电影蜜月| 日韩精品极品视频在线观看免费 | 日韩人妻无码精品一专区| 亚洲国产精品va在线播放|