仅在同一时间运行该功能一次

时间:2015-11-20 14:09:03

标签: javascript

我有以下问题。首先我的代码到目前为止:

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对象可以同时运行该功能,但我不知道,该怎么做。

3 个答案:

答案 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,有些librariessome 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语言中的工作方式。