javascript队列

简介: javascript队列
// Queue
var GQueue =  (function () {
    // 构造消费者队列
    // consumeFn: 消费者回调函数
    // consumeDelay: 控制消费者消费的速度(毫秒)
    // maxLen: 接收队列最大值,超出的消息将被丢弃
    function GQueue(consumeFn, consumeDelay, maxLen) {
        this.queue = new Array();
        this.maxLen = maxLen;
        this.dataMap = {};
        this.dataKeyQueue = new Array();
        this.checkUnique = false;
        this.consumeNoticeFn = consumeFn;
        this.consumeDelay = consumeDelay;
        this.consumeState = 0;
        this.consumeFlag = 0;
        this.owner = null;
    }
    // 延时函数
    GQueue.prototype.sleep = function (ms) {
        // @ts-ignore
        return new Promise(function (resolve, reject) {
            setTimeout(function () { return resolve(ms); }, ms);
        });
    };
    // 生产者:用于将消息提交到生产者队列
    GQueue.prototype.product = function (id, data) {
        if (this.queue.length < this.maxLen || this.maxLen == -1) {
            // 检查消息唯一性
            if (this.checkUnique && this.dataMap.hasOwnProperty(id)) {
                return;
            }
            // 插入消息
            this.queue.push({ 'id': id, 'data': data });
            this.dataKeyQueue.push(id);
            this.dataMap[id] = data;
            // 通知消费者
            if (this.consumeState == 0) {
                this.consume();
            }
            else {
                this.consumeFlag = 1;
            }
        }
    };
    // 消费者:将队列中的消息按照给定的速度进行消费
    GQueue.prototype.consume = function () {
        var _this = this;
        this.consumeState++;
        this.sleep(this.consumeDelay).then(function (r) {
            var data = _this.queue.shift();
            if (data) {
                _this.consumeNoticeFn(_this.owner, data['data']);
                // 检查并清理dataMap
                while (_this.maxLen > 0 && _this.dataKeyQueue.length >= _this.maxLen * 2) {
                    delete _this.dataMap[_this.dataKeyQueue.shift()];
                }
            }
            if (_this.queue.length > 0 || _this.consumeFlag) {
                _this.consumeFlag = 0;
                _this.consume();
            }
            _this.consumeState--;
        });
    };
    GQueue.prototype.setUnique = function (b) {
        this.checkUnique = b;
    };
    // 判断队列是否可写入
    GQueue.prototype.canWrite = function () {
        return (this.queue.length < this.maxLen || this.maxLen == -1);
    };
    // 设置拥有者
    GQueue.prototype.setOwner = function (owner) {
        this.owner = owner;
    };
    return GQueue;
}());
// DEMO //
var gqueue = new GQueue(function (owner, data) {
    console.log(owner, data);
}, 10, 10);
// 模拟产生消息
for (var i = 0; i < 50; i++) {
    if (gqueue.canWrite()) {
        gqueue.product(0, "product:" + i);
    }
}
相关文章
|
2月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
77 0
|
3月前
|
JavaScript 前端开发 API
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)(下)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
35 0
|
9月前
|
存储 算法 JavaScript
JavaScript 中的数据结构与算法:数组、链表、栈、队列等
在JavaScript中,数据结构和算法是非常重要的主题,它们用于有效地组织和处理数据。下面介绍几种常见的数据结构和算法:
|
4月前
|
JavaScript 前端开发
JavaScript题解剑指offer : 09. 用两个栈实现队列
JavaScript题解剑指offer : 09. 用两个栈实现队列
24 0
|
消息中间件 缓存 前端开发
JS案例:实现一个简单的任务队列-TaskQueue
JS案例:实现一个简单的任务队列-TaskQueue
398 0
JS案例:实现一个简单的任务队列-TaskQueue
|
10月前
|
JavaScript
JS 实现队列 #20
JS 实现队列 #20
67 0
|
存储 算法 JavaScript
JS算法探险之队列(Queue)
知识点简讲 滑动窗口 二叉树的广度优先搜索(BFS)
|
存储 JavaScript 前端开发
「数据结构与算法Javascript描述」队列
「数据结构与算法Javascript描述」队列
「数据结构与算法Javascript描述」队列
|
JavaScript
JS实现栈和队列
JS实现栈和队列
JS实现栈和队列
|
存储 前端开发 JavaScript
JavaScript总结:关于堆栈、队列中push()、pop()、shift()、unshift()使用方法的理解
JavaScript总结:关于堆栈、队列中push()、pop()、shift()、unshift()使用方法的理解
189 0
JavaScript总结:关于堆栈、队列中push()、pop()、shift()、unshift()使用方法的理解