JS addEventListener 處理

https://jsfiddle.net/p158qhLd/1/?fbclid=IwAR3jbwpNPZecD1PZWQ4gl7SUS4iRUCVzssSYUJyTdSBaBiarIykIQlUKMNE

<script id="worker" type="app/worker">
    addEventListener('message', function (e) {
        const data = e.data;

        if (data.msg == "start") {
            postMessage("done");
        } else if (data.msg == "func1") {
            postMessage("done1");
        } else if (data.msg == "func2") {
            postMessage("done2");
        }
    });
</script>
<script>

    main({
        thread_num: 4,
    });

    async function init_workers(thread_num) {
        const blob = new Blob([document.querySelector(‘#worker’).textContent]);
        const url = window.URL.createObjectURL(blob);

        return new Promise((resolve, reject) => {
            function handleWorker( /* args */) {
                return new Promise((resolve, reject) => {
                    const worker = new Worker(url);

                    worker.postMessage({ msg: "start" });
                    worker.addEventListener("message", function (data) {
                        resolve(worker);
                    }, false);
                    worker.onerror = function (err) {
                        reject(err)
                    }
                })
            }

            var workers = [];

            for (var i = 0; i < thread_num; i++) {
                workers.push(handleWorker( /* arg */))
            }

            Promise.all(workers)
                .then(res => {
                    console.log("all workers started")
                    resolve(res);
                })
                .catch(err => {
                    reject(err)
                });
        });
    }

    async function main(argc) {

        const thread_num = argc.thread_num;
        workers = await init_workers(thread_num);

        var barrier_buf = new SharedArrayBuffer(1 * Int8Array.BYTES_PER_ELEMENT);
        var barrier = new Int8Array(barrier_buf);

        for (let k = 0; k < 5; k++) {
            console.log("Round: ", k)

            await new Promise((resolve, reject) => {
                Atomics.store(barrier, 0, 0)

                for (let i = 0; i < thread_num; i++) {
                        workers[i].removeEventListener(‘message’, workers[i].messageHandler, true)
                    workers[i].messageHandler = function (e) {

                        if (e.data == "done1") {
                            console.log(1);

                            Atomics.add(barrier, 0, 1);

                            if (Atomics.load(barrier, 0) == thread_num) {
                                console.log("Reach first barrier.")
                                resolve();
                            }
                        }
                    };
                    workers[i].addEventListener(‘message’, workers[i].messageHandler, true)

                    workers[i].postMessage({
                        msg: "func1",
                    });
                }
            });

            console.log("=====================================")

            await new Promise((resolve, reject) => {
                Atomics.store(barrier, 0, 0)

                for (let i = 0; i < thread_num; i++) {

                                        workers[i].removeEventListener(‘message’, workers[i].messageHandler, true)
                    workers[i].messageHandler = function (e) {
                        if (e.data == "done2") {

                            console.log("2")

                            Atomics.add(barrier, 0, 1);

                            if (Atomics.load(barrier, 0) == thread_num) {
                                console.log("Reach second barrier.")
                                resolve();
                            }
                        }
                    };
                    workers[i].addEventListener(‘message’, workers[i].messageHandler, true)

                    workers[i].postMessage({
                        msg: "func2",
                    });
                }
            });

            console.log("++++++++++++++++++++++++++++++++++++++++")
        }

    }

</script>