JavaScript async/await シグナル処理

Promiseのthenを使用しない書き方の例です。
awaitが使えないイベントハンドラ内で使用すると便利
個人的にthen構文が苦手なのでawaitを多用しています。

とりあえずソースコード

export async function main(){

    let button = document.getElementById("button");
    if(!button)throw "button?";
  
    // ボタンが押されたらシグナル送信
    let sigwait = new SignalWait<string>();
    button.onclick = ()=>{ sigwait.signal("down"); }

    // ボタンが押されるまで待つ
    let event = await sigwait.wait();
    console.log(event);
    
    // 一定間隔で処理実行
    let sigInterval = new SignalWait<number>();
    let count = 0;
    setInterval(()=>{ sigInterval.signal(count++);}, 1000);
    // 描画系なら requestAnimationFrame
    while(1){
        let cnt = await sigInterval.wait();
        //1秒ごとに実行される
        console.log(cnt);
    }
    
}


export class SignalWait<T=any>{
    resolve : any[];
    constructor(){
        this.resolve = [];
    }
    
    async wait() : Promise<T>{
        return new Promise((rs)=>{this.resolve.push(rs);});
    }

    signal(val : T){
        if(this.resolve !== undefined){
            for(let rs of this.resolve){
                rs(val);
            }
            this.resolve = [];
        }
    }
}

いいなと思ったら応援しよう!

zerogram
この記事が役に立ったという方は、サポートお願いします。今後の製作の励みになります。