我有一个文档可以让用户能够多次运行相同的功能。有没有办法检查函数当前是否正在运行,然后才能重新激活它?
答案 0 :(得分:12)
设置外部标记。
var functionIsRunning = false;
function myFunction() {
if (!functionIsRunning) {
functionIsRunning = true;
//do stuff
functionIsRunning = false;
}
}
同样的原则适用于jQuery函数。
答案 1 :(得分:8)
这很容易。该功能未运行。
Javascript严格单线程。如果浏览器响应任何用户事件,则当前没有正在运行的功能。
答案 2 :(得分:1)
如果您调用很多功能,那么有很多实用程序可以帮助您管理此功能,请查看Promise
答案 3 :(得分:0)
你可以设置一个标志。像这样:
(function () {
// your application within a closure to not pollute global scope
var handlerRunning = false;
// the function that will be called and shouldn't be running twice
var handler = function () {
if (handlerRunning) return;
handlerRunning = true;
// do stuff here
// when you're done, set handlerRunning to false
handlerRunning = false;
}
// assign your code to event handler for example
document.getElementById('awesome-button').addEventListener('click', handler, false);
}());
答案 4 :(得分:0)
不是我的头脑,但你可以使用变量来设置是否正在执行的函数。类似的东西:
function MyWrapper() {
this.running = false;
this.run = function() {
if (this.running==false) {
this.running = true;
// do something
this.running = false;
return true;
}
else {
return false;
}
};
}
答案 5 :(得分:0)
如果将单个Deferred传递给
jQuery.when
,则该方法将返回其Promise对象(Deferred方法的子集)。可以调用Promise对象的其他方法来附加回调,例如deferred.then
。通过最初创建Deferred的代码解析或拒绝Deferred时,将调用相应的回调。例如,jQuery.ajax()
返回的jqXHR对象是Promise,可以这样使用:
$.when( $.ajax( "test.aspx" ) ).then(function( data, textStatus, jqXHR ) {
alert( jqXHR.status ); // Alerts 200
});
答案 6 :(得分:0)
迟到的回复,但我仍想在这里注明我的答案。
我遇到了一个类似的问题,我在其中嵌入了setInterval
后台服务器检查功能。但是,我的代码中还有很多可能性可以在其他一些标准上触发相同的功能。因此,为了确保我没有回忆起它,我只是使用本地存储来确保不会一次又一次地调用该功能。
此功能位于我的HTML文件中,
function serverCheck(value){
localStorage.setItem("isFunctionRunning",1);
setInterval(checkServerStatus, value);
}
下面的代码片段在我的另一个JS文件中,
function xyz(){
//someCode
var checkFunction = localStorage.getItem("isFunctionRunning");
if(checkFunction != 1){
serverCheck(frequency);
}
}