我的Chrome“睡眠”扩展程序似乎无法运行

问题描述

对于javascript和chrome扩展程序来说是非常新的东西,对于编程来说也很新。

我的manifest.json:

{
    "name": "GetUp aSec","version": "1.0","description": "Be healthy,get up!","manifest_version": 2,"content_scripts": [
        {
            "matches": [
                "<all_urls>"
            ],"js": [
                "content.js"
            ]
        }
    ],"browser_action": {
        "default_popup": "popup.html","default_icon": "icon.png"
    },"background": {
        "scripts": [
            "background.js"
        ]
    }
}

我的background.js是我在网上找到的一个功能,该功能被保证比正常的睡眠功能运行更流畅 然后每52分钟发送一条消息。

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve,ms));
}

while (true) {
    sleep(52000 * 60).then(() => {
        chrome.tabs.query({ currentwindow: true,active: true },function (tabs) {
                chrome.tabs.sendMessage(tabs[0].id,'its been 52 minutes! you should take a break.')
            })
    });
}

我的content.js只是一个希望可以提醒消息的侦听器。

chrome.runtime.onMessage.addListener(function (request) {
    alert(request)
})

当我将其添加到chrome中时,它不会给我任何错误,但也不会执行任何操作。有帮助吗?

解决方法

打开Chrome的任务管理器,您会看到扩展程序正在吞噬100%的CPU,陷入无尽的while循环中。

切换到async / await语法,以便实际暂停循环的主体

(async () => {
  while (true) {
    await sleep(52 * 60e3);
    chrome.tabs.query({currentWindow: true,active: true},tabs => {
      chrome.tabs.sendMessage(tabs[0].id,"It's been 52 minutes! You should take a break.");
    });
  }
})();

更好的是,使后台脚本仅按需加载("persistent": false),并使用chrome.alarms API,而不是带有setTimeout的无限循环。