You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web Worker onmessage事件未触发问题求助——定时提醒功能异常

问题:Web Worker的onmessage无法触发,无法实现指定日期提醒功能

我尝试开发一个指定日期的提醒功能,使用Web Worker结合主动等待机制,但Worker始终无法执行到onmessage函数内部的代码。试过this.onmessage、self.onmessage以及addEventListener,都没有效果。使用的API基于JavaScript,必须用JS开发。

现有代码

Main.js

function reminder(message, api) {
  var worker = new Worker("./worker.js");
  var mesCore = message.body.substr(message.body.indexOf(" ") + 1);
  worker.onmessage = function (e) {
    api.sendMessage("Ding dong " + mesCore, message.threadID);
};
worker.postMessage(mesCore);
}

worker.js

const cron = require('node-cron');

// 创建Worker时会执行此行代码

onmessage = function(e) {
    // 从未执行到此处
    console.log(e.data);
    var origin = new Date(e.data);
    cron.schedule("* * *", function() {
        var now = new Date();
        if (
            origin.getFullYear() == now.getFullYear() &&
            origin.getMonth() == now.getMonth() &&
            origin.getDate() == now.getDate()
        ) {
            postMessage('message');
            return;
        }
    });
}

解决方案

问题根源

浏览器环境的Web Worker不支持Node.js的require语法和node-cron模块,这会导致Worker初始化失败,代码根本无法执行到onmessage逻辑。

修改步骤及代码

  1. 移除Worker中的Node.js依赖,改用浏览器原生的setInterval实现日期轮询检查
  2. 确保Worker的消息监听语法正确,添加错误监听便于排查问题

修改后的worker.js

self.addEventListener('message', function(e) {
    console.log(e.data);
    const targetDate = new Date(e.data);
    // 每分钟检查一次日期是否匹配
    const checkTimer = setInterval(() => {
        const now = new Date();
        if (
            targetDate.getFullYear() === now.getFullYear() &&
            targetDate.getMonth() === now.getMonth() &&
            targetDate.getDate() === now.getDate()
        ) {
            self.postMessage('message');
            clearInterval(checkTimer); // 触发提醒后停止轮询
        }
    }, 60000); // 60秒间隔
});

优化后的Main.js(添加错误监听)

function reminder(message, api) {
  try {
    const worker = new Worker("./worker.js");
    const mesCore = message.body.substr(message.body.indexOf(" ") + 1);
    
    worker.onmessage = function (e) {
      api.sendMessage("Ding dong " + mesCore, message.threadID);
      worker.terminate(); // 任务完成后终止Worker,释放资源
    };

    // 监听Worker错误,快速定位加载或运行问题
    worker.onerror = function(error) {
      console.error('Worker 错误:', error.message, '文件:', error.filename, '行号:', error.lineno);
    };

    worker.postMessage(mesCore);
  } catch (err) {
    console.error('初始化Worker失败:', err);
  }
}

说明

浏览器Web Worker运行在独立的浏览器线程中,只能使用浏览器原生API,不支持Node.js专属模块。改用setInterval轮询日期,既符合浏览器环境要求,也能实现指定日期的提醒功能。触发提醒后记得终止Worker或清除定时器,避免不必要的资源消耗。

内容的提问来源于stack exchange,提问作者Noah Fraiture

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:15:24