Browsers, especially Chrome, crumble when we try to create too many image bitmaps at once. So we'll queue them up when too many are happening. Projects will load slightly slower but this is still much faster than <img> with data: URIs
63 lines
1.2 KiB
JavaScript
63 lines
1.2 KiB
JavaScript
const AsyncLimiter = require('../../src/util/async-limiter');
|
|
const {test} = require('tap');
|
|
|
|
test('Runs callback', async t => {
|
|
const callback = async (a, b) => a + b;
|
|
|
|
const limiter = new AsyncLimiter(callback, 2);
|
|
|
|
t.same(await Promise.all([
|
|
limiter.do(1, 2),
|
|
limiter.do(3, 4),
|
|
limiter.do(5, 6),
|
|
limiter.do(7, 8),
|
|
limiter.do(9, 10)
|
|
]), [
|
|
3,
|
|
7,
|
|
11,
|
|
15,
|
|
19
|
|
]);
|
|
t.end();
|
|
});
|
|
|
|
test('Errors', async t => {
|
|
t.plan(1);
|
|
const callback = () => Promise.reject('Error123!');
|
|
const limiter = new AsyncLimiter(callback, 10);
|
|
try {
|
|
await limiter.do();
|
|
} catch (e) {
|
|
t.equal(e, 'Error123!');
|
|
}
|
|
t.end();
|
|
});
|
|
|
|
test('Limit and queue', async t => {
|
|
const calls = [];
|
|
const callback = () => new Promise(resolve => {
|
|
calls.push({
|
|
resolve
|
|
});
|
|
});
|
|
|
|
const limiter = new AsyncLimiter(callback, 5);
|
|
|
|
for (let i = 0; i < 12; i++) {
|
|
limiter.do();
|
|
}
|
|
|
|
t.equal(calls.length, 5);
|
|
|
|
calls.forEach(i => i.resolve());
|
|
await Promise.resolve();
|
|
t.equal(calls.length, 10);
|
|
|
|
calls.forEach(i => i.resolve());
|
|
await Promise.resolve();
|
|
t.equal(calls.length, 12);
|
|
|
|
t.end();
|
|
});
|