作業Log | deno-async-throttle
documentの英文に悩んだ
17:28:43 とりあえずこうしたけど
code:ts
/** Options for throttle */
export interface Options {
/** the amount of milliseconds to wait for after the previous function is finished
*
* the default value is 0 (no interval)
*/
interval?: number;
/** whether not to delay executing the first function for interval
*
* default: false
*/
immediate?: boolean;
}
日本語でだと、こんな感じになる
code:ts
/** throttleのoption引数 */
export interface Options {
/** 前の関数を実行し終えたあとと次の関数を実行するまでの間隔
*
* 単位はmilliseconds
*
* 既定値は0(一切待たない)
*/
interval?: number;
/** 最初の関数をすぐに実行するかどうか
*
* すぐに実行しない場合はintervalだけ待ち、その間に呼び出された最後の関数だけ実行する
*
* 既定値はfalse
*/
immediate?: boolean;
}
うーん、英語に全然翻訳できていないな……
どうやらやっちゃだめらしい
該当コード(抜粋)
code:ts
return (...parameters: T) =>
new Promise<Result<U>>(async (resolve) => {
if (running) {
skipPrevFunction(parameters, resolve);
return;
}
running = true;
if (immediate) {
// 処理が来たら直ちに実行する
resolve({ result: await callback(...parameters), executed: true });
} else {
// 最初の処理もdelayだけ待つ
skipPrevFunction(parameters, resolve);
}
await runNext();
});
resolveを外側に持ち出したりしているから、簡単には直せない
いや、普通に書けるか
18:56:35 testが通らない……何故だ?
19:14:09 runningのフラグチェックのタイミングがおかしいみたい?
console.logを挟んで確認してみる
19:19:10 原因が分かった
code:ts
const runNext = async () => {
if (interval > 0) {
await sleep(interval);
}
if (!queue) {
running = false;
console.info("no queue is stacked. Make flag go down.");
return;
}
console.info("Run a next queued task");
await executeAsyncFunction(callback, queue);
console.info("Clear a queue");
queue = undefined;
await runNext();
};
await executeAsyncFunction(callback, queue);を実行している間に新しいタスクがqueueに格納されることを考慮していない
実行したら即座にqueueを空にするよう変更する
awaitを外せばいい
19:23:46 成功した。
19:25:04 tincanを使ったTest framworkに変える 20:02:46 一旦pushした
2021-09-14
08:05:57 とりあえず以下をやっている
うん?throttleの戻り値が表示されない?なんでだろう?
/icons/done.iconJSDoc中のミスを修正
08:41:20 終了
2021-09-24
16:32:24 なんか根本的にロジックがおかしい気がする
sleepとか実行中判定とか
前の関数の実行終了後から計測を開始しないといけない
ていうか実行中判定はPromiseが終了しているかどうかで判定できないか? 2021-10-27
07:41:47 テストをrefactoringしている
describeの直下で、その条件で使用する変数と函数を初期化する
重複をなくす
08:25:45 sleep()を挟んだテストを追加する
これ終わったら、with argumentsの方にも同じテストを追加する
08:54:29 やってる
09:03:56 引数を適当に決めるのがめんどい
09:11:36 確率で失敗するテストがあった
やばいtakker.icon
なおす
09:16:35 なおした
09:22:12 また確率で失敗するテストが発覚した
こんどはwithout arguments > with interval > immediate: false > suppress multiple callsだ
実行順序が確定する部分にだけ値チェックをいれるようにしよう
09:30:25 完了
そのあとtry...catchのテストを作ったらおしまい
10:06:16 脱線してた
10:38:02 reject時にsleep()していなかった
これを直したら複数のテストが失敗してしまった
codeを考え直す必要があるな……
10:44:46 いや、コードはこれでいいんだ
resolve直前に積まれたタスクより、resolveしてから次のawaitの間に追加されたタスクを優先する
immediate: trueのときの末尾のsleepのpromiseを待てないのが原因
どうしたもんかな
いっそのこと、函数を実行できるかどうかを示すpromiseをつくるか?
await readyで函数の実行終了とintervalの終了を待つ
11:57:35 一旦中断
この方針でやってみたが、またよくわからないエラーが出た
中断すべき
17:45:17 めんどくさくなってきたので実行前後に一定時間待つ機能を全部削った
問題を作っている原因は全部この機能なので
ていうか本当に一定時間待つ機能なんて必要だったのか?
17:50:14 released