TIL 023同期settimeout破壊


状況はこうです。


状況はもっと複雑ですが、一般化すれば
マスタモジュール
-while文で同期操作を繰り返します.
-関数を別のモジュールにロードして使用し、propertyを変更するコールバック関数を追加します.(例では置き換え)
△実際には、モジュールの区分は何も変わりません.
const test = async () => {
    const callback = () => console.log("callback");

    console.log("start");
    while (1) {
        await task(() => callback());
    }
    console.log("end");
};

test();

初めての試み

module.exports = async cb => {
    return await setTimeout(res => {
        cb();
    }, 1000);
};
もちろんだめです.settimeRoutはasync waitの追加を約束したオブジェクトを返しません.Timeoutオブジェクトを返します.

結果はもちろん一度も応答されず、無限ループで関数呼び出しがメモリ障害を引き起こす.
他のモジュールの関数が非同期呼び出しであることを決定できます.

2回目の試み


では、promiseオブジェクトに戻るとどうなりますか?
module.exports = cb => {
    return new Promise(res => {
        setTimeout(res => {
            cb();
            res;
        }, 1000);
    });
};
まず,上記の関数はresをres()として実行していないため,結果は動作しない.

でもちょっとおかしいです.
errorでもwhile文外でも終わりでもなく、コールバック関数が実行された後はこのように終わりました...?
探してみました.
ノードjsは、timerまたはネットワークリクエストのように、非同期リクエスト時にrefカウントを行う.このカウントはresolveを呼び出すと減少し、イベントループが終了するとカウント0でプログラムを終了するかどうかを決定します.
基本情報を作成するのは、refカウントを向上させるための単純なオブジェクト作成ではありません.
もしそうであれば、私はpromiseを作成して戻り、コールバックリファレンス(no pending callback)refカウントが上昇せず、timerが正常に動作して終了し、イベントループが終了するとrefが0になるのでnodeJSは終了します.
https://stackoverflow.com/questions/46966890/what-happens-when-a-promise-never-resolves
https://www.youtube.com/watch?v=PNa9OMajw9w

3回目の試み


resを実行しないのも問題ですが、resをパラメータとして矢印関数に渡す場合は定義されません.(だから肝臓は——)ロッカーを通ってresを運転しなければなりません.
module.exports = cb => {
    return new Promise(res => {
        setTimeout(() => {
            cb();
            res();
        }, 1000);
    });
};
したがって、プロセスオブジェクトresを待つref cntが昇格され、1秒ごとにコールバックが繰り返される.
千辛万苦を経て実現したと言える...