在多次激发时运行一次js函数

Run js function once when fired more than once

本文关键字:一次 js 函数 运行      更新时间:2023-09-26

我有一个div,它使用jQuery加载带有javascript函数的文件/内容。。

function DoWork() {
    // Do Stuff
}

假设用户可以使用相同的js函数DoWork()重新加载Div并提取相同的文件/内容。问题是,当重新加载文件时,上一个加载的函数DoWork()仍在运行。如何杀死之前启动的DoWork()并重新启动它?

Javascript是单线程的,这意味着在给定的时刻只能执行一件事。如果DoWork已经在"运行",它要么是a)阻止所有其他JS代码,并且您别无选择,只能让它完成,因为在它自己完成之前,您无法执行任何中断代码,要么是b)DoWork计划通过setTimeout()setInterval()在一个间隔内启动。

如果是后一种情况,setTimeout()setInterval()将返回一个ID。将该ID存储在某个位置,并根据启动方式调用clearTimeout(doWork_timeout_id)clearInterval(doWork_interval_id)

您可以构建一个使用:setTimeout的简单函数,然后每次对DoWork的调用都会首先调用:clearTimeout。我真的不喜欢这个解决方案,因为你会在setTimeout上浪费CPU。因此,另一种选择是在DoWork中使用web worker(如果你在另一个线程中运行大数据,它会为你做很多其他好事)-然后你可以选择每次启动DoWork()的工作时发送"停止"消息。

是否使用ajax加载div的内容?如果是这样,更好的方法如下:

var doWorkAjax=null;
function DoWork(){
    if (doWorkAjax) doWorkAjax.abort(); 
    doWorkAjax = $.ajax(url, data, function(result){
        ....
        doWorkAjax=null;
    });
}