Предотвращение многократного запуска функции в JavaScript - PullRequest
0 голосов
/ 05 октября 2011

Я работаю с кодом, который делает это:

var _init = false;

this.init = function(){

    if(_init)
        return;
    else
        _init = true;

    // Do a bunch of stuff here
}

Мне кажется, что там есть крошечная раса, которую я хотел бы устранить. Второй экземпляр функции init может быть запущен до того, как первый экземпляр установит для _init значение true. Вряд ли, но не ноль, да?

Учитывая это, есть ли простой способ устранить это состояние гонки, если не считать что-то вроде паттерна синглтона?

Ответы [ 2 ]

4 голосов
/ 05 октября 2011

JavaScript является однопоточным (на данный момент игнорируя веб-работников), поэтому вы должны быть в порядке - не должно быть условий гонки.

Я думаю, что «стандартный» способ сделать это, однако, будет использовать самопризывающуюся функцию

(function(){
    // init stuff here, but you don't need to have any of the _init stuff
})() // <-- this causes your function to be invoked immediately
0 голосов
/ 05 октября 2011

Один простой способ убедиться, что функция запускается только один раз, - это просто удалить метод в конце:

this.init = function(){
    // Do a bunch of stuff here

    // now delete:
    delete this.init;
}

или вы можете переназначить свойство в нерабочее состояние, если вам нужно будет вызвать его снова:

this.init = function(){
    // Do a bunch of stuff here

    this.init - function() {};
}

Но это только гарантирует, что функция будет запускаться один раз для экземпляра - если вам нужно, чтобы она запускалась только один раз, когда-либо , ваш подход на основе флагов, вероятно, лучше, и, как и другие постеры предположили, что ваши опасения по поводу состояния гонки необоснованны с помощью однопоточного кода.

...