scrivito
Version:
Scrivito is a professional, yet easy to use SaaS Enterprise Content Management Service, built for digital agencies and medium to large businesses. It is completely maintenance-free, cost-effective, and has unprecedented performance and security.
57 lines (49 loc) • 1.51 kB
text/typescript
import {
Deferred,
collectInListAndSchedule,
nextTick,
} from 'scrivito_sdk/common';
type Mget<KEY_TYPE, RETURN_TYPE> = (keys: KEY_TYPE[]) => Promise<RETURN_TYPE[]>;
interface Item<KEY_TYPE, RETURN_TYPE> {
key: KEY_TYPE;
deferred: Deferred<RETURN_TYPE>;
}
export class BatchRetrieval<KEY_TYPE, RETURN_TYPE> {
private mget: Mget<KEY_TYPE, RETURN_TYPE>;
private batchSize: number;
constructor(
mget: Mget<KEY_TYPE, RETURN_TYPE>,
{ batchSize }: { batchSize?: number } = {}
) {
this.mget = mget;
this.batchSize = batchSize || 100;
}
retrieve(key: KEY_TYPE): Promise<RETURN_TYPE> {
const deferred = new Deferred<RETURN_TYPE>();
this.scheduleItem({ key, deferred });
return deferred.promise;
}
private scheduleItem = collectInListAndSchedule<Item<KEY_TYPE, RETURN_TYPE>>(
nextTick,
(items: Item<KEY_TYPE, RETURN_TYPE>[]) => {
const nextBatch = items.splice(0, this.batchSize);
const keys = nextBatch.map((item) => item.key);
this.mget(keys).then(
(results) => {
nextBatch.forEach(({ key, deferred }, index) => {
if (index < results.length) {
const result = results[index];
deferred.resolve(result);
} else {
this.retrieve(key).then(deferred.resolve, deferred.reject);
}
});
},
(error) => {
nextBatch.forEach((item) => item.deferred.reject(error));
}
);
return items;
}
);
}