- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须找到一种方法来实现一个函数,该函数接受输入数字并返回/显示最接近的较小素数或输入本身(如果它是素数)。
但是,输入可能是一个非常大的数字,在这种情况下,内部函数会阻塞事件循环,我必须确保浏览器能够在计算期间处理事件。
我的实现是这样的:
function getClosestPrime(num) {
return isPrime(num) ? num : getClosestPrime(num-1);
}
function isPrime(num) {
for (let i = 2; i < num; i++) {
if(num % i === 0) return false;
}
return num !== 1;
}
有人可以帮助我实现并给我解释/提示以供将来引用吗?
提前致谢。
最佳答案
因为 JavaScript 是单线程的,所以最好的解决方案是获得第二个线程来为您解决问题。这可以通过使用 Web Workers API 来实现.
有了网络 worker ,您的客户端算法很简单:
客户端代码:
// create the worker
var primeWorker = new Worker('calculate-prime.js');
function doPrimeComputationInWorker(number) {
function handleWorkerCompletion(message) {
if (message.data.command == 'done') {
// update UI using the 'primeNumber' value received in the message
console.log(message.data.primeNumber);
// remove the event listener
primeWorker.removeEventListener('message', handleWorkerCompletion);
}
}
// add the event listener
primeWorker.addEventListener('message', handleWorkerCompletion, false);
// post the number to the worker
primeWorker.postMessage({
'number': number
});
}
代码应该足够简单,您只需更改工作人员完成时更新 UI 的代码即可。
现在您需要网络 worker 代码。这是 calculate-prime.js
的框架:
// add the event listener
self.addEventListener('message', start);
function start(message) {
// get the number value from the message
var number = message.data.number;
// perform the calculation
var nearestPrime = calculateNearestPrime(number);
// return the result
self.postMessage({
'command': 'done',
'primeNumber': nearestPrime
});
}
function calculateNearestPrime(number) {
// your implementation goes here
// return the result
return result;
}
我会把质数的计算留给你,但是 Sieve of Eratosthenes很容易实现,如果您不想自己编写代码,您可以在网上找到 JavaScript 实现。你可以使用 Web Storage API保存生成的素数列表并加速 future 的计算。
为了将来引用,您应该了解 Promises和 Generators这样您就可以使用它们来解决您的异步问题。
关于javascript - 使用 setTimeout 打破长时间运行的功能以允许事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50069266/
我有一个独立的 Thread 应用程序。这是一个等待消息的监听器,当消息到达时执行一些操作,其中我必须将消息保存在数据库中。但我遇到了问题,因为如果我运行应用程序并“手动发送消息”,一切都会正常工作,
我有以下php代码: sleep(65); $query = "UPDATE database.table SET XXXXXXX = XXXXXXX - ".$YYYYYY." WHERE
我正在开发一个业余爱好应用程序。它在主布局中使用 webview。单击 webview 内的链接会使用户保持在 webview 内。启动后一切正常,但仍在应用程序内。但是,在手机休眠一段时间后,我重新
我目前运行的应用程序需要最大堆大小为 16GB。 目前我使用以下标志来处理垃圾回收。 -XX\:+UseParNewGC, -XX\:+UseConcMarkSweepGC, -XX:CMSIniti
$ uname -a Darwin Wheelie-Cyberman 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011
在 while 循环仍在休眠时退出它的最简单方法是什么?是否有某种函数可以在 sleep 时检测某个值是否为真? 或者我是否在循环中设置一个小 sleep 并检查如果不再睡一会儿就退出?如果可以,我该
我正在 Ubunu 的 Jetty 6 上运行 Java Web 服务器,用于基于反向 ajax 的 Web。而且我在向浏览器重新发送数据的线程滞后方面遇到了严重的问题。很多时候,一些线程开始 hib
当我运行长时间操作时,我遇到来自 IIS 的请求超时。我的 ASP.NET 应用程序正在后台处理数据,但处理的记录数量很大,因此操作需要很长时间。 但是,我认为 IIS 使 session 超时。这是
我不确定从哪里开始解决这个问题,但如果我有一个 AJAX 网络应用程序向服务器发送请求并在数据库(在我的例子中是 postgresql)上运行长查询,有没有办法停止或如果仍在运行时用户刷新页面或关闭
我是一名优秀的程序员,十分优秀!