Work on client modes
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
import { assertEquals } from "../../test_deps.ts";
|
||||
import { PromiseQueue, sleep } from "./async.ts";
|
||||
|
||||
Deno.test("PromiseQueue test", async () => {
|
||||
const q = new PromiseQueue();
|
||||
let r1RanFirst = false;
|
||||
const r1 = q.runInQueue(async () => {
|
||||
await sleep(10);
|
||||
r1RanFirst = true;
|
||||
// console.log("1");
|
||||
return 1;
|
||||
});
|
||||
const r2 = q.runInQueue(async () => {
|
||||
// console.log("2");
|
||||
await sleep(4);
|
||||
return 2;
|
||||
});
|
||||
assertEquals(await Promise.all([r1, r2]), [1, 2]);
|
||||
assertEquals(r1RanFirst, true);
|
||||
let wasRun = false;
|
||||
await q.runInQueue(async () => {
|
||||
await sleep(4);
|
||||
wasRun = true;
|
||||
});
|
||||
assertEquals(wasRun, true);
|
||||
});
|
||||
@@ -0,0 +1,69 @@
|
||||
export function throttle(func: () => void, limit: number) {
|
||||
let timer: any = null;
|
||||
return function () {
|
||||
if (!timer) {
|
||||
timer = setTimeout(() => {
|
||||
func();
|
||||
timer = null;
|
||||
}, limit);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// race for promises returns first promise that resolves
|
||||
export function race<T>(promises: Promise<T>[]): Promise<T> {
|
||||
return new Promise((resolve, reject) => {
|
||||
for (const p of promises) {
|
||||
p.then(resolve, reject);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function timeout(ms: number): Promise<never> {
|
||||
return new Promise((_resolve, reject) =>
|
||||
setTimeout(() => {
|
||||
reject(new Error("timeout"));
|
||||
}, ms)
|
||||
);
|
||||
}
|
||||
|
||||
export function sleep(ms: number): Promise<void> {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
export class PromiseQueue {
|
||||
private queue: {
|
||||
fn: () => Promise<any>;
|
||||
resolve: (value: any) => void;
|
||||
reject: (error: any) => void;
|
||||
}[] = [];
|
||||
private running = false;
|
||||
|
||||
runInQueue(fn: () => Promise<any>): Promise<any> {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.queue.push({ fn, resolve, reject });
|
||||
if (!this.running) {
|
||||
this.run();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private async run(): Promise<void> {
|
||||
if (this.queue.length === 0) {
|
||||
this.running = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this.running = true;
|
||||
const { fn, resolve, reject } = this.queue.shift()!;
|
||||
|
||||
try {
|
||||
const result = await fn();
|
||||
resolve(result);
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
}
|
||||
|
||||
this.run(); // Continue processing the next promise in the queue
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
import { assertEquals } from "../../test_deps.ts";
|
||||
import { PromiseQueue, sleep } from "./async.ts";
|
||||
|
||||
Deno.test("PromiseQueue test", async () => {
|
||||
const q = new PromiseQueue();
|
||||
let r1RanFirst = false;
|
||||
const r1 = q.runInQueue(async () => {
|
||||
await sleep(10);
|
||||
r1RanFirst = true;
|
||||
console.log("1");
|
||||
return 1;
|
||||
});
|
||||
const r2 = q.runInQueue(async () => {
|
||||
console.log("2");
|
||||
await sleep(4);
|
||||
return 2;
|
||||
});
|
||||
console.log(await Promise.all([r1, r2]));
|
||||
assertEquals(r1RanFirst, true);
|
||||
});
|
||||
Reference in New Issue
Block a user