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);
    }
}
相关文章
|
7月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
255 0
|
7月前
|
JavaScript 前端开发 API
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)(下)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
97 0
|
4月前
|
JavaScript 前端开发
js事件队列
js事件队列
144 55
|
3月前
|
JavaScript 前端开发 API
详解队列在前端的应用,深剖JS中的事件循环Eventloop,再了解微任务和宏任务
该文章详细讲解了队列数据结构在前端开发中的应用,并深入探讨了JavaScript的事件循环机制,区分了宏任务和微任务的执行顺序及其对前端性能的影响。
|
2月前
|
存储 JavaScript 前端开发
js事件队列
【10月更文挑战第15天】
50 6
|
3月前
|
JavaScript 前端开发
js事件队列
js事件队列
28 0
|
4月前
|
JavaScript 前端开发
JavaScript——一个简单的队列Demo
JavaScript——一个简单的队列Demo
41 4
|
5月前
|
JavaScript
数据结构(用 JS 实现栈和队列【三种方式】)
数据结构(用 JS 实现栈和队列【三种方式】)
61 0
|
7月前
|
前端开发 JavaScript 算法
JavaScript 中实现常见数据结构:栈、队列与树
JavaScript 中实现常见数据结构:栈、队列与树
|
7月前
|
存储 JavaScript 索引
深入理解栈和队列(js的问题)
深入理解栈和队列(js的问题)
23 0