如何让 Chrome 扩展程序休眠一段时间并在端口上发布消息

Posted

技术标签:

【中文标题】如何让 Chrome 扩展程序休眠一段时间并在端口上发布消息【英文标题】:How to make a Chrome Extension sleep for a time and post message on port 【发布时间】:2019-12-25 09:50:50 【问题描述】:

在我的扩展程序中,我希望扩展程序等待一段时间,因为它会更改内容中的某些内容并且不能很快。 我正在使用睡眠功能,它只是一个在时间到来时会中断的循环,但它会使我的计算机非常慢。 我使用了 setTimeout 方法,但扩展名说“未定义端口”,因为当 setTimeout 方法运行时代码继续运行,但我认为端口停止连接。 那么,您知道如何在不损坏计算机的情况下让代码休眠吗?

睡眠功能

function sleep(milliseconds) 

  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) 
     for(var j=0;j<10000000;j++)
        if ((new Date().getTime() - start) > milliseconds)
            return;
    
  

端口代码

chrome.runtime.onConnect.addListener(function(port) 
  console.assert(port.name == "knockknock");

  port.onMessage.addListener(function(msg) 
    console.log("mesajjj");
    if (msg.joke == "Baslat")
        setTimeout(firstwaiting, 5000);
        console.log("wait");
    
  );

);

function firstwaiting()
  port.postMessage(question: "waited"); 
  console.log("waited, now goes on");


我使用第二种方法和 setTimeout 方法得到“第一次等待时未定义端口”错误。 连接没有问题,它可以使用睡眠功能,但我需要更好的方法。

我希望在不花费太多精力的情况下延迟。我尝试了几天,但我什至在网上都找不到方法。提前致谢。

【问题讨论】:

【参考方案1】:

您的sleep 函数实际上并没有休眠/等待,它只是阻塞了页面的主线程。在 javascript 中,唯一正确的睡眠方式是 setTimeout/setInterval 和类似的内置函数。

解决方案:不要使用 sleep(),只需将 port 作为参数传递给计时器回调。

chrome.runtime.onConnect.addListener(function (port) 
  port.onMessage.addListener(function (msg) 
    if (msg.joke == 'Baslat') 
      setTimeout(firstwaiting, 5000, port);
    
  );
);

function firstwaiting(port) 
  port.postMessage(question: 'waited');

【讨论】:

你是我的英雄,非常感谢!!我尝试了很长时间:) 顺便说一句,我无法投票,我没有足够的声誉。

以上是关于如何让 Chrome 扩展程序休眠一段时间并在端口上发布消息的主要内容,如果未能解决你的问题,请参考以下文章

关于在Qt里让程序休眠一段时间的方法总结

让暂时不用的chrome标签页休眠节省内存的插件

TypeScript 怎么让程序休眠一段时间

计算机系统篇之异常控制流:如何正确地让调用线程休眠一段时间

计算机系统篇之异常控制流:如何正确地让调用线程休眠一段时间

Chrome扩展程序中的javascript点击行为问题