2016-11-13 6 views
0

У меня есть функция, которая вызывается через событие socket.io. Эта функция находится в другом расписании. Я хочу убедиться, что каждый раз, когда функция называется вызываемой, переменные в модуле не меняются предыдущими вызовами функций.переменные сервера в функциях

Я знаю, как это сделать на других языках: создайте новый экземпляр объекта, вызовите функцию, но я не могу заставить ее работать в javascript.

код выглядит следующим образом:

socket.io модуль, где функция вызывается

// -- all events -- // 
io.on('connection', function (socket) { 
    console.log('user connected'); 

    socket.on('increase', function (data) { 
     var increaser = require('./increase.js'); 
     increaser.increase(); 
    }); 
}); 

увеличение модуль, должен напечатать 1 каждый раз, но печатает 1..2..3..4 ....

/*jslint node: true */ 
"use strict"; 

// -- variables -- // 
var counter = 0; 

module.exports = { 
    increase : function() { 
     counter += 1; 
     console.log(counter); 
    } 
}; 

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

ответ

1

Вы можете сделать то же самое, что и другие языки, используя экземпляр object, как показано ниже.

Метод 1: Простейшие функции объекта

/*jslint node: true */ 
"use strict"; 


module.exports = function() { 
    this.counter = 0; 
    this.increase = function() { 
     this.counter += 1; 
     console.log(this.counter); 
    }; 
}; 

Метод 2: Функция с прототипом

/*jslint node: true */ 
"use strict"; 

function Increaser() { 

} 

Increaser.prototype = { 
    counter: 0, 
    increase: function() { 
     this.counter += 1; 
     console.log(this.counter); 
    }; 
}; 

module.exports = Increaser; 

И в вашем socket.io,

// -- all events -- // 
io.on('connection', function (socket) { 
    console.log('user connected'); 

    socket.on('increase', function (data) { 
     var Increaser = require('./increase.js'); 
     var increaser = new Increaser(); 
     // Also you can use as below in one line 
     // var increaser = new require('./increase.js')(); 
     increaser.increase(); 
    }); 
}); 
+0

и теперь вы можете избавиться от 'var counter = 0' –

+1

Да справа @JoseHermosillaRodrigo. исправлено сейчас :-) – Aruna

+0

@Aruna, поэтому я должен экспортировать каждую переменную, которую функция использует с this.variable в функции экспорта? – Vujukas

0

Важная концепция здесь заключается в том, что require() всегда будет возвращать один и тот же объект, а не новую версию каждый раз.

Таким образом, var increaser = require('./increase.js'); внутри обратного вызова является анти-шаблоном. Если вы хотите новый объект каждый раз, подумайте о том, чтобы сделать функцию увеличения. Js вернуть функцию, которая возвращает ваш модуль увеличения. Тогда var counter не будет глобальным.