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

Javascript 多次激发时运行js函数一次,javascript,jquery,Javascript,Jquery,我有一个Div,它使用jQuery加载带有javascript函数的文件/内容 function DoWork() { // Do Stuff } 假设用户可以重新加载Div并使用相同的js函数DoWork提取相同的文件/内容。问题是,重新加载文件时,先前加载的函数DoWork仍在运行。我怎样才能终止之前启动的DoWork并重新启动它?Javascript是单线程的,这意味着在给定时刻只能执行一件事情。如果DoWork已经在运行,那么它可能是一个阻塞所有其他JS代码的程序,您别无选择,

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

function DoWork() {
    // Do Stuff
}

假设用户可以重新加载Div并使用相同的js函数DoWork提取相同的文件/内容。问题是,重新加载文件时,先前加载的函数DoWork仍在运行。我怎样才能终止之前启动的DoWork并重新启动它?

Javascript是单线程的,这意味着在给定时刻只能执行一件事情。如果DoWork已经在运行,那么它可能是一个阻塞所有其他JS代码的程序,您别无选择,只能让它完成,因为在它自己完成之前,您无法执行任何中断代码,或者b DoWork计划通过setTimeout或setInterval在某个时间间隔触发


如果是后一种情况,则setTimeout和setInterval返回一个ID。将该ID存储在某个位置,并根据启动方式调用clearTimeoutdoWork\u timeout\u ID或clearIntervaldoWork\u interval\u ID。

Javascript是单线程的,这意味着在给定时刻只能执行一件事情。如果DoWork已经在运行,那么它可能是一个阻塞所有其他JS代码的程序,您别无选择,只能让它完成,因为在它自己完成之前,您无法执行任何中断代码,或者b DoWork计划通过setTimeout或setInterval在某个时间间隔触发


如果是后一种情况,则setTimeout和setInterval返回一个ID。将该ID存储在某个位置,并根据启动方式调用ClearTimeoutWork\u timeout\u ID或clearIntervaldoWork\u interval\u ID。

您可以构建一个简单的函数,使用:setTimeout,然后对DoWork的每次调用都将首先调用:clearTimeout。我真的不喜欢这个解决方案,因为设置超时会浪费CPU。
因此,另一个选择是在DoWork中使用web worker。如果您在另一个线程中运行大数据,那么它将为您带来许多其他好处。然后,您可以选择在每次开始DoWork工作时发送“停止”消息。

您可以构建一个简单的函数,使用该函数:设置超时,然后每次调用DoWork将首先调用:clearTimeout。我真的不喜欢这个解决方案,因为设置超时会浪费CPU。
因此,另一个选择是在DoWork中使用web worker。如果您在另一个线程中运行大数据,那么它将为您带来许多其他好处—然后您可以选择在每次开始DoWork工作时发送“停止”消息。

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

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

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

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

重新加载div是什么意思?这是通过事件处理程序处理的吗?如果是这样,为什么不在启动处理程序后立即解除绑定呢?或者使用类似jQuery的onceeasest将原始函数声明放在条件iftypeof DoWork==='undefined'{function DoWork{…}}中,这样它只有在未检测到的情况下才会被加载。DoWork中是否有间隔?使用模式是什么?为什么要花很长时间运行?@DanielMendel我认为不赞成将函数声明置于某个条件下。我的意思是,我使用jquery将外部php文件的html拉入DIV。你说的重新加载DIV是什么意思?这是通过事件处理程序处理的吗?如果是这样,为什么不在启动处理程序后立即解除绑定呢?或者使用类似jQuery的onceeasest将原始函数声明放在条件iftypeof DoWork==='undefined'{function DoWork{…}}中,这样它只有在未检测到的情况下才会被加载。DoWork中是否有间隔?使用模式是什么?为什么要花很长时间才能运行?@DanielMendel我认为不赞成将函数声明置于某个条件下。我的意思是,我使用jQueryes将外部php文件的html拉入DIV中。我使用AJAX将php文件加载到包含js函数的DIV中。是的,我使用AJAX将php文件加载到包含js的DIV中功能定位销