gpt4 book ai didi

javascript - 仅当不处理该功能时如何在网络浏览器中运行javascript功能

转载 作者:行者123 更新时间:2023-11-30 12:23:04 26 4
gpt4 key购买 nike

我的一个 javascript 函数正在处理数百万数据,它每秒从硬件事件中调用约 1 次。然后网络浏览器在该功能处理中空闲。

我试图设置一个标志来运行(或不运行)该函数:

if (!is_calculating)
is_calculating = true;
else
return;


my_function(); // do heavy stuff


is_calculating = false;

但它不起作用,因为它正在进入代码并且网络浏览器进入空闲状态直到完成。当它返回时,标志总是 OK,因为它完成了 //do heavy stuff

我可以为这种行为做些什么吗?如果设置了标志,我想跳转函数执行。

最佳答案

问题是,默认情况下 javascript 在浏览器上以单线程运行,因此您的代码甚至在开始处理下一个调用之前就已完全执行,导致 is_calculating 在函数执行时始终为 false叫做。您可以使用的一种解决方法(不是世界上最干净的解决方案)是将您的整体“繁重的东西”函数分成许多较小的函数,并让它们通过 setTimeout(nextFunc, 1)。让它们以这种方式相互调用,让浏览器有时间做它需要做的事情,如果它正在做的话,还会再次调用你的函数。这一次,因为你的函数是在它已经被执行的“中间”调用的,所以 is_calculating 仍然是 true,并且调用将像你期望的那样在开始时返回。请注意,此解决方案可能不如 Web Workers solution 更可取。 , 但它更简单。

function sleep(millis) {
var date = new Date()
var curDate = null
do { curDate = new Date() }
while(curDate-date < millis)
}

function reallyLong() {
if(!reallyLong.flag) {
reallyLong.flag = true
} else {
console.log("Not executing")
return
}

sleep(250)
setTimeout(reallyLong2, 1)

function reallyLong2() {
sleep(250)
setTimeout(reallyLong3, 1)
}

function reallyLong3() {
sleep(250)
setTimeout(reallyLong4, 1)
}

function reallyLong4() {
sleep(250)
console.log("executed")
reallyLong.flag = false
}
}

如果您在主函数内定义所有连续的函数,它还允许它们都简单轻松地访问相同的数据。

现在唯一的问题是,如果您的函数正在返回一些值,您需要重写它以返回一个 promise。 (您自己的设计或使用类似 Q 的库),或接受回调作为参数,“链”中的最后一个函数将调用该回调并将返回值作为参数。

请注意,上面的 sleep 函数是 hack,非常糟糕,绝对不应该使用。

关于javascript - 仅当不处理该功能时如何在网络浏览器中运行javascript功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30388472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com