Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/cvetdv.ru/bitrix/js/im/v2/component/dialog/chat/src/helpers/ |
Upload File : |
type Task = { args: Array<any>, resolve: (result: any) => void, }; const sharedQueues: Map<string, (...args: any[]) => Promise<any>> = new Map(); /** * @description * Adds a delay between calls to the fn function. * Calls with the same function execute this function in the same sequence * @param fn * @param delay * @param context * @returns Function */ function sequentializeShared( fn: (...args: any[]) => any, delay: number, context: any = null, ): (...args: any[]) => Promise<any> { if (sharedQueues.has(fn)) { return sharedQueues.get(fn); } const wrapped = sequentialize(fn, delay, context); sharedQueues.set(fn, wrapped); return wrapped; } function sequentialize( fn: (...args: any[]) => any, delay: number, context: any = null, ): (...args: any[]) => Promise<any> { const queue: Array<Task> = []; let isRunning = false; async function run(): Promise<void> { if (isRunning) { return; } isRunning = true; const task = queue.shift(); if (!task) { isRunning = false; return; } const result = fn.apply(context, task.args); await wait(delay); task.resolve(result); isRunning = false; run(); } return (...args: any[]): Promise<any> => { return new Promise((resolve) => { queue.push({ args, resolve }); run(); }); }; } function wait(ms: number): Promise<void> { return new Promise((resolve) => { setTimeout(resolve, ms); }); } export { sequentializeShared as sequentialize };