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 快捷键设置实现代码
Mar 13 Javascript
return false,对阻止事件默认动作的一些测试代码
Nov 17 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
Jun 12 Javascript
实现JavaScript的组成----BOM和DOM详解
May 18 Javascript
Jquery删除css属性的简单方法
Dec 04 Javascript
数组Array的排序sort方法
Feb 17 Javascript
微信小程序多张图片上传功能
Jun 07 Javascript
让你彻底掌握es6 Promise的八段代码
Jul 26 Javascript
详解关于react-redux中的connect用法介绍及原理解析
Sep 11 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
Jun 05 Javascript
jQuery实现弹幕特效
Nov 29 jQuery
JavaScript实现栈结构Stack过程详解
Mar 07 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
ThinkPHP的Widget扩展实例
2014/06/19 PHP
php正则表达式学习笔记
2015/11/13 PHP
yii数据库的查询方法
2015/12/28 PHP
示例详解Laravel的注册重构
2016/08/14 PHP
详解PHP PDO简单教程
2019/05/28 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
2007/10/23 Javascript
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
jQueryPad 实用的jQuery测试工具(支持IE,chrome,FF)
2010/05/22 Javascript
用Juery网页选项卡实现代码
2011/06/13 Javascript
jQuery Ajax 仿AjaxPro.Utility.RegisterTypeForAjax辅助方法
2011/09/27 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
2013/11/21 Javascript
JQuery以JSON方式提交数据到服务端示例代码
2014/05/05 Javascript
使用ajax+jqtransform实现动态加载select
2014/12/01 Javascript
js全选实现和判断是否有复选框选中的方法
2015/02/17 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
jQuery获取file控件中图片的宽高与大小
2016/08/04 Javascript
jQuery实现的自定义弹出层效果实例详解
2016/09/04 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
JS调用Android、Ios原生控件
2017/01/06 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
vue父组件向子组件动态传值的两种方法
2017/11/11 Javascript
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
python使用rpc框架gRPC的方法
2018/08/24 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
网页中的电话号码如何实现一键直呼效果_附示例
2016/03/15 HTML / CSS
HTML5 移动页面自适应手机屏幕四类方法总结
2017/08/17 HTML / CSS
采用专利算法搜索最廉价的机票:CheapAir
2016/09/10 全球购物
洲际酒店集团英国官网:IHG英国
2019/07/10 全球购物
《风筝》教学反思
2016/02/23 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android