如何在 javascript 高效锁定线程?

How to lock thread in javascript energy efficient?

我想在浏览器中修补 alert 对象,以显示额外的文本,但我需要等待一些数据才能在警报中显示必要的内容。但是,我不能推迟 alert 电话。

此外,我不知道有什么方法可以在没有用户操作的情况下关闭警报并显示另一个警报(如果存在,它也可以解决我的问题)。

所以,我必须等待一些数据,但我无法打破 alert 行为,它会阻止代码的执行。

要等待回复,我可以这样做:

var start = performance.now();
while(true) {
  var time = performance.now() - start;
  if (time >= 3000) break;
}

console.log('done');

但我不会检查计时器,而是会检查一些数据。

这种方式应该可行,但这对性能来说很糟糕,因为它与 alert 相反,后者只是冻结线程并且在关闭对话框之前什么都不做,我们将加载 CPU 无用的工作。

是否可以冻结线程以提高能源效率?

我必须冻结线程,直到我从工作人员那里获得一些数据。

为什么 promise 不能解决您的问题?

Promises 不会阻塞主线程,因此这不会重现我需要的 alert 的行为。

阻塞线程对用户不友好,并不是说你需要等待一些数据

我知道了,这篇笔记对开发网页和应用程序来说足够公平了。

但是这个案例比较特殊。我开发了一个功能 浏览器扩展,翻译警报。浏览器扩展不得修改页面的行为。所以当一个网站调用警报时,线程必须被冻结。浏览器扩展不得推迟 alert 调用以避免页面出现意外行为。

您可以在此处查看功能说明:Feat: Implement optional translation of alerts and console logs #102

我能想到的在不消耗 CPU 的情况下“阻塞”的唯一方法是创建同步 XMLHttpRequest(不推荐使用,因为阻塞不是 user-friendly)。您需要设置一个服务器,该服务器可以读取请求的有效负载并在指定的时间后回复。

const xh = new XMLHttpRequest();
xh.open('GET', urlToYourServer, false);
xh.send('3');

其中“3”是服务器解析的请求主体(并在 3 秒后响应)。

就是说,你不应该这样做 - 这是一种非常不优雅且 user-unfriendly 的方法。在此过程中,它将阻止任何其他操作(包括浏览器重绘和其他请求)发生。最好适当地等待您需要的任何东西(无论是通过 Promise 的 .then、回调还是其他方式)——但如果问题中没有更多上下文,具体如何实现这一点尚不清楚。