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下异步提交表单 异步跨域提交表单
Nov 17 Javascript
情人节之礼 js项链效果
Feb 13 Javascript
学习jQuey中的return false
Dec 18 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
Jun 05 Javascript
详解用webpack2搭建angular2的项目
Jun 22 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
Dec 06 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
Dec 23 Javascript
javascript动态创建对象的属性详解
Nov 07 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
Dec 25 Javascript
vue cli使用融云实现聊天功能的实例代码
Apr 19 Javascript
微信小程序中如何使用flyio封装网络请求
Jul 03 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
Nov 20 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
smarty中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
实现php删除链表中重复的结点
2018/09/27 PHP
jquery 获取json数据实现代码
2009/04/27 Javascript
dropdownlist之间的互相联动实现(显示与隐藏)
2009/11/24 Javascript
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
jQuery中;function($,undefined) 前面的分号的用处
2014/12/17 Javascript
JS实现的另类手风琴效果网页内容切换代码
2015/09/08 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
AngularJS自定义指令详解(有分页插件代码)
2017/06/12 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
2020/06/01 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
python写一个md5解密器示例
2018/02/23 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
python树的同构学习笔记
2019/09/14 Python
详解rem 适配布局
2018/10/31 HTML / CSS
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
英国工艺品购物网站:Minerva Crafts
2018/01/29 全球购物
你常见到的runtime exception
2016/09/05 面试题
销售人员中英文自荐信
2013/09/22 职场文书
大学校运会广播稿
2014/02/03 职场文书
事业单位鉴定材料
2014/05/25 职场文书
党的生日活动方案
2014/08/15 职场文书
放飞理想演讲稿
2014/09/09 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
2016年元旦主持词
2015/07/06 职场文书
企业文化学习心得体会
2016/01/21 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
Python面试不修改数组找出重复的数字
2022/05/20 Python