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 相关文章推荐
分享几个超级震憾的图片特效
Jan 08 Javascript
JS 对输入框进行限制(常用的都有)
Jul 30 Javascript
jquery中load方法的用法及注意事项说明
Feb 22 Javascript
页面元素绑定jquery toggle后元素隐藏的解决方法
Mar 27 Javascript
浅谈JavaScript异常处理语句
Jun 26 Javascript
jQuery Validate验证框架详解(推荐)
Dec 17 Javascript
js 判断登录界面的账号密码是否为空
Feb 08 Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
Sep 30 Javascript
搭建一个Koa后端项目脚手架的方法步骤
May 30 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
Apr 14 Javascript
vue+AI智能机器人回复功能实现
Jul 16 Javascript
编写v-for循环的技巧汇总
Dec 01 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
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
XML的代替者----JSON
2007/07/21 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
JS实现程序暂停与继续功能代码解读
2013/10/10 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
vue2.x select2 指令封装详解
2017/10/12 Javascript
vue keep-alive请求数据的方法示例
2018/05/16 Javascript
js实现删除li标签一行内容
2019/04/16 Javascript
js实现简易计算器功能
2019/10/18 Javascript
Vue的click事件防抖和节流处理详解
2019/11/13 Javascript
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
Python实现数通设备端口使用情况监控实例
2015/07/15 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
2018/06/19 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
对Python函数设计规范详解
2019/07/19 Python
详解python中的数据类型和控制流
2019/08/08 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
2016/03/21 HTML / CSS
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
飞利浦比利时官方网站:Philips比利时
2016/08/24 全球购物
意大利网上药房:Farmacia 33
2020/01/27 全球购物
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
Python面试题:如何用Python来发送邮件
2016/03/15 面试题
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
委托书格式要求
2015/01/28 职场文书
推销搭讪开场白
2015/05/28 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP