2016-11-13 104 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); 
    } 
}; 

我想知道如何做到这一点,因为我的服务器上的函数被调用,调用几个asyncronous功能,我想确保所有变量留像他们直到第如果另一个客户端连接并触发相同的事件,那么整个功能将完成并且不会改变。

回答

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');回调里面是一个反模式。 如果你每次都想要一个新的对象,可以考虑使increase.js返回一个返回你的增加器模块的函数。那么var counter不会是全球性的。