我有以下问题。首先我的代码到目前为止:
function Auktionator() {
this.versteigern = function(objekt) {
for(var i = 1; i <=3; i++) {
setTimeout(function(x) { return function() { console.log(objekt + " zum " + x); }; }(i), 1000*i);
}
};}
现在我希望只有一个Auktionator对象可以同时运行该功能,但我不知道,该怎么做。
答案 0 :(得分:2)
跟踪正在运行的超时数,并使用guard子句来防止并发运行。
function Auktionator() {
this.versteigern = function (objekt) {
if (Auktionator.LOCKS > 0) {
console.log('running');
return;
}
for (var i = 1; i <= 3; i++) {
Auktionator.LOCKS++;
setTimeout(function (x) {
return function () {
console.log(objekt + " zum " + x);
Auktionator.LOCKS--;
};
}(i), 1000 * i);
}
};
}
Auktionator.LOCKS = 0;
new Auktionator().versteigern()
new Auktionator().versteigern()
答案 1 :(得分:1)
hacky解决方法是添加变量isRunning
:
// Static variable shared by all instance
Auktionator.isRunning = false;
然后,当您开始执行时,检查是否Auktionator.isRunning === false
,将其设置为true
并在您完成后将其重新设置为false
。
在一些异步调用之后,您有很多选项可以执行代码: Promises,有些libraries或some awesome stuff brought by ES6。
答案 2 :(得分:1)
你可以有一个全局变量
var function_in_use = 0
然后添加
function_in_use = 1
在函数内容的最开头,并在return语句之前添加function_in_use = 0
。然后,您可以将整个内容包装在if
语句中:if (!function_in_use) { ...
。
我不知道这是否符合您的特殊需求。这类似于#import "filename"
语句在C语言中的工作方式。