GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — ConcurrentQueue/JavaScript/1-channels.js at master · HowProgrammingWorks/ConcurrentQueue Expand file tree/ Copy path1-channels.jsMore file actions 93 lines (80 loc) · 1.96 KB / Copy path1-channels.jsFile metadata and controls93 lines (80 loc) · 1.96 KB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 'use strict'; class Queue { constructor(concurrency) { this.concurrency = concurrency; this.count = 0; this.waiting = []; this.onProcess = null; this.onDone = null; this.onSuccess = null; this.onFailure = null; this.onDrain = null; } static channels(concurrency) { return new Queue(concurrency); } add(task) { const hasChannel = this.count < this.concurrency; if (hasChannel) return void this.next(task); this.waiting.push(task); } next(task) { this.count++; this.onProcess(task, (error, result) => { if (error) { this.onFailure?.(error); } else { this.onSuccess?.(result); } this.onDone?.(error, result); this.count--; if (this.waiting.length > 0) { const task = this.waiting.shift(); this.next(task); return; } if (this.count === 0 && this.onDrain) { this.onDrain(); } }); } process(listener) { this.onProcess = listener; return this; } done(listener) { this.onDone = listener; return this; } success(listener) { this.onSuccess = listener; return this; } failure(listener) { this.onFailure = listener; return this; } drain(listener) { this.onDrain = listener; return this; } } // Usage const job = (task, next) => { console.log(`Process: ${task.name}`); setTimeout(next, task.interval, null, task); }; const queue = Queue.channels(3) .process(job) .done((error, res) => { if (error) console.log(`Done with error: ${error}`); const { count } = queue; const waiting = queue.waiting.length; console.log(`Done: ${res.name}, count: ${count}, waiting: ${waiting}`); }) .success((res) => void console.log(`Success: ${res.name}`)) .failure((error) => void console.log(`Failure: ${error}`)) .drain(() => void console.log('Queue drain')); for (let i = 0; i < 10; i++) { queue.add({ name: `Task${i}`, interval: i * 1000 }); } |
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |