JS异步函数队列功能实例分析


Posted in Javascript onNovember 28, 2017

本文实例讲述了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了。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript 支持ie和firefox杰奇翻页函数
Jul 22 Javascript
js利用Array.splice实现Array的insert/remove
Jan 13 Javascript
小型js框架veryide.librar源代码
Mar 05 Javascript
指定位置如果有图片显示图片,无图片显示广告的JS
Jun 05 Javascript
D3.js实现雷达图的方法详解
Sep 22 Javascript
详解在Vue中通过自定义指令获取dom元素
Mar 04 Javascript
vue和webpack安装命令详解
Jun 15 Javascript
vue移动端实现红包雨效果
Jun 23 Javascript
JavaScript 2018 中即将迎来的新功能
Sep 21 Javascript
微信小程序实现文字跑马灯
May 26 Javascript
基于vue-cli3创建libs库的实现方法
Dec 04 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
Dec 29 Javascript
浅谈vue,angular,react数据双向绑定原理分析
Nov 28 #Javascript
JS+HTML+CSS实现轮播效果
Nov 28 #Javascript
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
Nov 28 #Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
Nov 28 #Javascript
vue-music关于Player播放器组件详解
Nov 28 #Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
Nov 28 #Javascript
JS实现的找零张数最小问题示例
Nov 28 #Javascript
You might like
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
PHP的可变变量名的使用方法分享
2012/02/05 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
Laravel 5.3 学习笔记之 安装
2016/08/28 PHP
js arguments.callee的应用代码
2009/05/07 Javascript
js切换div css注意的细节
2012/12/10 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
JavaScript实现简单精致的图片左右无缝滚动效果
2017/03/16 Javascript
详解使用JS如何制作简单的ASCII图与单极图
2017/03/31 Javascript
Vue实例中生命周期created和mounted的区别详解
2017/08/25 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
JavaScript遍历数组的方法代码实例
2020/01/14 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
python爬虫入门教程之点点美女图片爬虫代码分享
2014/09/02 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
Python类装饰器实现方法详解
2018/12/21 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
python实现高斯(Gauss)迭代法的例子
2019/11/20 Python
python实现删除列表中某个元素的3种方法
2020/01/15 Python
Python如何解除一个装饰器
2020/08/07 Python
Python实现加密的RAR文件解压的方法(密码已知)
2020/09/11 Python
澳大利亚顶级美发和美容贸易超市:glamaCo
2020/01/19 全球购物
办公室驾驶员岗位职责
2013/11/15 职场文书
11月红领巾广播稿
2014/01/17 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript
总结python多进程multiprocessing的相关知识
2021/06/29 Python
vue动态绑定style样式
2022/04/20 Vue.js