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闭包
Dec 14 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
May 08 Javascript
JavaScript实现弹出子窗口并传值给父窗口
Dec 18 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
Nov 23 Javascript
js实现内容显示并使用json传输数据
Mar 16 Javascript
JS模仿手机端九宫格登录功能实现代码
Apr 28 Javascript
bootstrapValidator自定验证方法写法
Dec 01 Javascript
VsCode新建VueJs项目的详细步骤
Sep 23 Javascript
原生js封装的ajax方法示例
Aug 02 Javascript
在vue中使用SockJS实现webSocket通信的过程
Aug 29 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
Sep 30 Javascript
微信小程序个人中心的列表控件实现代码
Apr 26 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获取文章上一页与下一页的方法
2014/12/01 PHP
详解php的socket通信
2015/08/11 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
js 数组的for循环到底应该怎么写?
2010/05/31 Javascript
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
2011/10/24 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
js简单实现删除记录时的提示效果
2013/12/05 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
javascript中DOM复选框选择用法实例
2015/05/14 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
JavaScript鼠标特效大全
2016/09/13 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
JavaScript实现的斑马线表格效果【隔行变色】
2017/09/18 Javascript
详解Vue中使用Axios拦截器
2019/04/22 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
Vue表单控件数据绑定方法详解
2020/02/05 Javascript
[01:22:29]真视界:2019年国际邀请赛总决赛
2020/01/29 DOTA
python 对字典按照value进行排序的方法
2019/05/09 Python
python日期相关操作实例小结
2019/06/24 Python
Django密码系统实现过程详解
2019/07/19 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
Python获取时间戳代码实例
2019/09/24 Python
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
CNC数控操作工岗位职责
2013/11/19 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
财务审计整改报告
2014/11/06 职场文书
求职自荐信范文(优秀篇)
2015/03/27 职场文书
读《教育心理学》心得体会
2016/01/22 职场文书