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题目,重写函数让其无限相加
Feb 15 Javascript
JavaScript实现GriwView单列全选(自写代码)
May 13 Javascript
js获取IP和PcName(IE)在vs中可用
Aug 02 Javascript
简单的js表单验证函数
Oct 28 Javascript
javascript 应用小技巧方法汇总
Jul 05 Javascript
JQuery自适应窗口大小导航菜单附源码下载
Sep 01 Javascript
基于jquery步骤进度条源码分享
Nov 12 Javascript
jQuery实现对象转为url参数的方法
Jan 11 Javascript
基于jquery.page.js实现分页效果
Jan 01 jQuery
Vue 2.0 侦听器 watch属性代码详解
Jun 19 Javascript
vue select 获取value和lable操作
Aug 28 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
Sep 10 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 删除数组元素
2009/01/16 PHP
解析php中获取系统信息的方法
2013/06/25 PHP
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
php把数组值转换成键的方法
2015/07/13 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
2016/06/30 PHP
php从数据库中获取数据用ajax传送到前台的方法
2018/08/20 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
2012/07/15 Javascript
javascript面向对象之访问对象属性的两种方式分析
2015/01/13 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
AngularJS优雅的自定义指令
2016/07/01 Javascript
Ubuntu系统下Angularjs开发环境安装
2016/09/01 Javascript
AngularJs定时器$interval 和 $timeout详解
2017/05/25 Javascript
vue.js中ref和$refs的使用及示例讲解
2019/08/14 Javascript
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
简介Python设计模式中的代理模式与模板方法模式编程
2016/02/02 Python
Python实现字符串匹配算法代码示例
2017/12/05 Python
基于Python3.6+splinter实现自动抢火车票
2018/09/25 Python
python opencv判断图像是否为空的实例
2019/01/26 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
使用python实现对元素的长截图功能
2019/11/14 Python
python装饰器使用实例详解
2019/12/14 Python
在python中求分布函数相关的包实例
2020/04/15 Python
keras 如何保存最佳的训练模型
2020/05/25 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
成人大专自我鉴定范文
2013/10/19 职场文书
商学院大学生求职的自我评价
2014/03/12 职场文书
整改报告格式
2014/11/06 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
刮痧观后感
2015/06/05 职场文书
2016教师读书思廉心得体会
2016/01/23 职场文书
2016年社区服务活动总结
2016/04/06 职场文书
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python