91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

昔阳县| 普安县| 晋城| 开封县| 鲁甸县| 尖扎县| 辽阳县| 大石桥市| 兴义市| 平邑县| 东宁县| 鹰潭市| 页游| 饶平县| 阳城县| 沅陵县| 中阳县| 宝应县| 康定县| 安西县| 本溪| 广丰县| 肥东县| 绥宁县| 登封市| 沁阳市| 德安县| 东台市| 黑山县| 太保市| 修文县| 乐平市| 科技| 紫云| 郸城县| 北宁市| 水城县| 铁岭县| 隆昌县| 缙云县| 平南县|