函数中的服务器变量

时间:2016-11-13 22:04:56

标签: javascript node.js asynchronous

我有一个通过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);
    }
};

我想知道如何做到这一点,因为在我的服务器上调用一个调用一些异步函数的函数,并且我想确保所有变量保持不变,直到整个函数被完成并且不会被更改如果另一个客户端连接并触发相同的事件。

2 个答案:

答案 0 :(得分: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();
    });
});

答案 1 :(得分:0)

这里的重要概念是require()将始终返回相同的对象,而不是每次都返回一个新版本。

所以回调中的var increaser = require('./increase.js');是一种反模式。 如果每次都想要一个新对象,可以考虑使用increase.js返回一个返回你的gainr模块的函数。然后var counter将不是全球性的。