上限付きで複数の函数を非同期に実行し、順番を維持して結果を返す関数
from 複数回呼び出されるcallbackをPromisicationするやついろいろ
上限付きで複数の函数を非同期に実行し、順番を維持して結果を返す関数
promise-parallel-throttleみたいなことをする
Iterable<Arg>→Iterable<Promise<{ success: true; value: T; } | { success: false; value: E; }>>
順番は維持する
idには、どの処理レーンを使っているのかの番号が入る
実装したいこと
テストを書く
https://deno.land/std@0.127.0/async/pool_test.ts を参考にする
code:mod.ts
export type Result<T, E> = { success: true; value: T; } | { success: false; value: E; };
export function* pool<Arg extends unknown[], T, E = unknown>(
threshold: number,
args: Iterable<Arg>,
func: (...args: ...Arg, number) => Promise<T>,
): Generator<Promise<Result<T, E>>, void, unknown> {
let running = 0;
const waitings = [] as (() => number)[];
const waitForReady = async () => {
running++;
if (running <= threshold) return running - 1;
return await new Promise<number>(
(resolve) => waitings.push(resolve)
);
};
for (const arg of args) {
yield (async () => {
const id = await waitForReady();
try {
return {
success: true,
value: await func(...arg, id),
};
} catch(e: unknown) {
return {
success: false,
value: e as E,
};
} finally {
waitings.shift()?.(id);
}
})();
}
// 実行しきれない可能性はある?
}
#promisify
#2022-03-03 00:05:19