中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS如何實現異步函數隊列功能

發布時間:2021-07-09 14:09:02 來源:億速云 閱讀:136 作者:小新 欄目:web開發

小編給大家分享一下JS如何實現異步函數隊列功能,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

具體如下:

場景:

做直播,會有入場消息,入場特效,用戶如果有坐騎,需要給他展示幾秒鐘的坐騎特效,如果幾個人同時進場,那該怎么展示呢?這時候就會想到setTimeout函數,對,思路不錯,但是,異步函數隊列怎么實現呢?直接上代碼:

var Queue = function() {
    this.list = [];
};
Queue.prototype = {
    constructor: Queue,
    queue: function(fn) {
      this.list.push(fn)
      return this;
    },
    wait: function(ms) {
      this.list.push(ms)
      return this;
    },
    dequeue: function() {
      var self = this,
        list = self.list;
      self.isdequeue = true;
      var el = list.shift() || function() {};
      if (typeof el == "number") {
        setTimeout(function() {
          self.dequeue();
        }, el);
      } else if (typeof el == "function") {
        el.call(this)
        if (list.length) {
          self.dequeue();
        } else {
          self.isdequeue = false;
        }
      }
    }
};

例子:

如果a,b差不多同時進來;
c在a,b還沒完全出隊列的時候,進來的;
d在a,b,c都除了隊列之后再進來的。

var q = new Queue();
function a() {
    console.log("a執行了", new Date());
}
function b() {
    console.log("b執行了", new Date());
}
function c() {
    console.log("c執行了", new Date());
}
function d() {
    console.log("d執行了", new Date());
}
q.wait(2000);
q.queue(a);
q.wait(2000);
q.queue(b);
q.dequeue();
setTimeout(function(){//3S之后進來的
    q.wait(2000);
    q.queue(c);
},3000);
setTimeout(function(){//8S之后進來的
    q.wait(2000);
    q.queue(d);
    q.dequeue();
},8000);

這里我們就需要判斷什么時候要調用dequeue來出隊列了。(為什么c進隊列的時候,不需要dequeue,但是d進來的時候就需要dequeue了呢?)

但是一般我們是無法知道用戶什么時候進場的,一般都是進隊列了,就該能出隊列,但是如果用戶是在空隊列的時候進來的,之前的遞歸調用dequeue就執行完了,你進來需要再執行 出隊列的操作。

于是,代碼應該這樣:

var q = new Queue();
  function a() {
    console.log("a執行了", new Date());
  }
  function b() {
    console.log("b執行了", new Date());
  }
  function c() {
    console.log("c執行了", new Date());
  }
  function d() {
    console.log("d執行了", new Date());
  }
  q.wait(2000);
  q.queue(a);
  if (!q.isdequeue) {
    q.dequeue();
  }
  q.wait(2000);
  q.queue(b);
  if (!q.isdequeue) {
    q.dequeue();
  }
  setTimeout(function() { //3S之后進來的
    q.wait(2000);
    q.queue(c);
    if (!q.isdequeue) {
      q.dequeue();
    }
  }, 3000);
  setTimeout(function() { //8S之后進來的
    q.wait(2000);
    q.queue(d);
    if (!q.isdequeue) {
      q.dequeue();
    }
  }, 8000);

這樣,每進一次隊列,就判斷要不要出隊列,事情就OK了。

以上是“JS如何實現異步函數隊列功能”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

js
AI

包头市| 桑日县| 酉阳| 万年县| 苍南县| 临颍县| 蒲江县| 新龙县| 安阳市| 平顺县| 京山县| 明星| 霍山县| 河东区| 宁德市| 子洲县| 高尔夫| 永春县| 乐昌市| 营山县| 平罗县| 马边| 乌鲁木齐县| 通辽市| 南通市| 阳高县| 深州市| 运城市| 六枝特区| 武威市| 衡山县| 金寨县| 高雄县| 望谟县| 广德县| 定兴县| 古浪县| 玉山县| 绥江县| 凉城县| 通许县|