Node.js模块级变量未定义

时间:2013-10-29 17:52:56

标签: javascript node.js scope

我在从所述模块内部的函数内访问模块级变量的范围时遇到问题。见下文......

var socketio = require('socket.io');
var socket = socketio.listen();

var myCustomModule = require('./lib/mycustommodule')('http://mysite:8080');

socket.on('connection', function connection(socket) {

    socket.emit('message', {data:"test1"});  <====THIS WORKS

    socket.on('init', function init(data) {

        socket.emit('message', {data:"test1"});  <====THIS WORKS

        refreshMyCustomModule();
    });

});

var refreshMyCustomModule = function() {

    socket.emit('message', {data:"test1"}); <=====THIS DOESN'T WORK

    myCustomModule.beginSomeAsyncTask(function(data) { <======THIS DOESN'T WORK

         socket.emit('message', {data:"test2"}); <========THIS DOESN'T WORK

    });

};

查看上面的示例。当我突然调用我的refreshMyCustomModule函数时socketmyCustomModule变得未定义。我也试过使用它以及设置var self = this

我在客户端上用javascript编写了一堆,但是当在node.js中进行编码时,似乎范围不同,我只是无法解决这个问题。

2 个答案:

答案 0 :(得分:3)

请注意,脚本全局级别的socketsocket 中的function connection是两个不同的变量function connection中的一个是从连接事件传递到该函数的参数。您在refreshMyCustomModule中使用的那个是全局的,您调用listen的那个。

如果我们更改名称,则更清楚,因为它们是不同的变量:

var socketio = require('socket.io');
var socketUsedForListen = socketio.listen();

var myCustomModule = require('./lib/mycustommodule')('http://mysite:8080');

socketUsedForListen.on('connection', function connection(socketFromConnection) {

    socketFromConnection.emit('message', {data:"test1"});

    socketFromConnection.on('init', function init(data) {

        socketFromConnection.emit('message', {data:"test1"});

        refreshMyCustomModule();
    });

});

var refreshMyCustomModule = function() {

    socketUsedForListen.emit('message', {data:"test1"});

    myCustomModule.beginSomeAsyncTask(function(data) {

         socketUsedForListen.emit('message', {data:"test2"});

    });

};

我有理由相信你意味着socketFromConnection使用refreshMyCustomModule,而不是socketUsedForListen。如果是这样,请将refreshMyCustomModule 移动到连接回调中,或将套接字作为参数传递给它。

答案 1 :(得分:1)

这是因为你在socket.on('init')中使用异步事件会导致范围问题。我相信如果你传递你想要使用的参数,它将起作用。 e.g:

var socketio = require('socket.io');
var socket = socketio.listen();

var myCustomModule = require('./lib/mycustommodule')('http://mysite:8080');

socket.on('connection', function connection(socket) {
    socket.emit('message', {data:"test1"});  <====THIS WORKS

    socket.on('init', function init(data) {

        socket.emit('message', {data:"test1"});  <====THIS WORKS

        refreshMyCustomModule(socket, myCustomModule);
    });

});

var refreshMyCustomModule = function(socket, module) {

    socket.emit('message', {data:"test1"}); <=====THIS DOESN'T WORK

    module.beginSomeAsyncTask(function(data) { <======THIS DOESN'T WORK

         socket.emit('message', {data:"test2"}); <========THIS DOESN'T WORK

    });

};