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语句中的CDATA标签的意义
May 09 Javascript
javascript cookies操作集合
Apr 12 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
Mar 11 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
Sep 18 Javascript
javascript动态创建及删除元素的方法
Dec 22 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
Aug 20 Javascript
11种ASP连接数据库的方法
Sep 18 Javascript
jquery中键盘事件小结
Feb 24 Javascript
VUE多层路由嵌套实现代码
May 15 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
Jan 18 Javascript
angular实现input输入监听的示例
Aug 31 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
Oct 22 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
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
PHP 对象继承原理与简单用法示例
2020/04/21 PHP
收藏Javascript中常用的55个经典技巧
2007/08/12 Javascript
JS Array对象入门分析
2008/10/30 Javascript
js DataSet数据源处理代码
2010/03/29 Javascript
一步一步制作jquery插件Tabs实现过程
2010/07/06 Javascript
jquery获取特定name所有选中的checkbox,支持IE9标准模式
2013/03/18 Javascript
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
怎么清空javascript数组
2013/05/11 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
详解Axios统一错误处理与后置
2018/09/26 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
教大家使用Python SqlAlchemy
2016/02/12 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
2018/07/18 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
Python3 列表,数组,矩阵的相互转换的方法示例
2019/08/05 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
python标准库OS模块详解
2020/03/10 Python
css3实现书本翻页效果的示例代码
2021/03/08 HTML / CSS
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
Zooplus葡萄牙:欧洲领先的网上宠物商店
2018/07/01 全球购物
电气专业应届生求职信
2013/11/01 职场文书
中英文自我评价语句
2013/12/20 职场文书
雨雪天气温馨提示
2015/07/15 职场文书
2016特色励志班级口号
2015/12/24 职场文书
倡议书怎么写?
2019/04/11 职场文书
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL