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 相关文章推荐
jquery增加时编辑jqGrid(实例代码)
Nov 08 Javascript
Extjs4中的分页应用结合前后台
Dec 13 Javascript
PHP中使用微秒计算脚本执行时间例子
Nov 19 Javascript
jQuery实现简单的日期输入格式化控件
Mar 12 Javascript
swtich/if...else的替代语句
Aug 16 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
Dec 05 Javascript
input输入密码变黑点密文的实现方法
Jan 09 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
Sep 28 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
Jan 09 Javascript
vue-cli V3.0版本的使用详解
Oct 24 Javascript
浅谈一个webpack构建速度优化误区
Jun 24 Javascript
vue实现页面滚动到底部刷新
Aug 16 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新手NOTICE错误常见解决方法
2011/12/07 PHP
php检测useragent版本示例
2014/03/24 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
laravel 去掉index.php伪静态的操作方法
2019/10/12 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
js 弹出框只弹一次(二次修改之后的)
2013/11/26 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
JavaScript中数组的合并以及排序实现示例
2015/10/24 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
2016/06/02 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
vue-router路由懒加载和权限控制详解
2017/12/13 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
js实现跳一跳小游戏
2020/07/31 Javascript
[01:11:10]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG加赛
2014/05/26 DOTA
python通过pil为png图片填充上背景颜色的方法
2015/03/17 Python
python中类变量与成员变量的使用注意点总结
2017/04/29 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
python使用thrift教程的方法示例
2019/03/21 Python
python 将有序数组转换为二叉树的方法
2019/03/26 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
TensorFlow2.0矩阵与向量的加减乘实例
2020/02/07 Python
python爬虫可以爬什么
2020/06/16 Python
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
一套中级Java程序员笔试题
2015/01/14 面试题
自荐信不宜过于夸大
2013/11/06 职场文书
公司停电通知
2015/04/15 职场文书
迁徙的鸟观后感
2015/06/09 职场文书
清明节随笔
2015/08/15 职场文书