首页 > 解决方案 > 如何让 Chrome 扩展程序休眠一段时间并在端口上发布消息

问题描述

在我的扩展程序中,我希望扩展程序等待一段时间,因为它会更改内容中的某些内容并且它不能很快。我正在使用睡眠功能,它只是一个在时间到来时会中断的循环,但它会使我的计算机非常慢。我使用了 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 方法的第二种方法得到“第一次等待时未定义端口”错误。连接没有问题,它可以与睡眠功能一起使用,但我需要一个更好的方法。

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

标签: javascriptgoogle-chrome-extensionsettimeoutsleep

解决方案


您的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'});
}

推荐阅读