JS异步函数队列功能实例分析
作者:异次元的玫瑰园 发布时间:2024-04-22 13:26:28
标签:JS,队列
本文实例讲述了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程序设计有所帮助。
来源:https://www.cnblogs.com/MissFelicia/p/6650396.html


猜你喜欢
- (以下内容部分内容参考了http://adomas.org/javascript-mouse-wheel/ )之前js 仿Photoshop
- 当需要实现html页面部分模块截图并具有保存图片功能时,前台直接生成截图并下载会方便的多。多的不说,直接看代码首先我们需要引入2个js文件:
- sympy有个vector 模块,里面提供了求解标量场、向量场的梯度、散度、旋度等计算,官方参考连接:http://docs.sympy.o
- 解决空格和空行报错问题到build文件夹下面的webpack.base.conf.js文件。然后打开该文件,找到图下这段代码,把他注释掉。注
- 下面看下字符串List按照长度排序(python)的实现方法myList = ['青海省','内蒙古自治区'
- 密钥密码'''如密钥短语密码为: university -> universty明文: abcdefghijk
- 问题描述在电脑中重新安装Anaconda3&PyCharm后,运行原来的程序画图时出现了下图界面。不能弹出如下图所示的“figure”窗口。
- 关于窗口函数的基础,请看文章SQL窗口函数取值窗口函数可以用于返回窗口内指定位置的数据行。常见的取值窗口函数如下:LAG函数可以返回窗口内当
- python共现矩阵实现最近在学习python词库的可视化,其中有一个依据共现矩阵制作的可视化,感觉十分炫酷,便以此复刻。项目背景本人利用爬
- 实例一:题目:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?程序分析:可填在百位、十位、个位的数字都是1、
- 当我们的文章表中没有对于文章的评论数字段时,我们该这么写sql语句来显示出评论最多的文章呢?下面本站给大家收集了几种方法,仅供参考:1.se
- 在 MySQL 中,EXPLAIN 命令是一种非常重要的查询优化工具,它可以帮助我们分析 SQL 查询语句的执行计划,以及如何优化它们。在使
- v-model 最好用的就是配合 data 達成 Two-way Binding,但若使用 Vuex 之後,是否還能使用 v-model 搭
- import turtle as tt.setup(800,600,0,0,)t.pensize(2)t.speed(1)t.color(&
- GROUP BY 是分组查询, 一般 GROUP BY 是和 聚合函数配合使用,你可以想想你用了GROUP BY 按
- 目录解决MySQL主从数据库没有同步的两种方法一、不同步情况二、解决方案1.先进入主库,进行锁表,防止数据写入2.进行数据备份3.查看mas
- <!--#include file="config.asp" -->&nbs
- #coding:utf-8 #批量修改文件名 import os import re import datetime re_st = r
- 1 自动微分我们在《数值分析》课程中已经学过许多经典的数值微分方法。许多经典的数值微分算法非常快,因为它们只需要计算差商。然而,他们的主要缺
- 前言说到覆盖索引之前,先要了解它的数据结构:B+树。先建个表演示(为了简单,id按顺序建):idname1aa3kl5op8aa10kk11