1

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

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 中编码时,范围似乎不同,我就是无法破解这个坚果。

4

2 回答 2

3

请注意,socket在您的脚本的全局级别和您的socket内部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"});

    });

};

我有理由确定您打算使用socketFromConnectionin refreshMyCustomModule,而不是socketUsedForListen. 如果是这样,要么将 移动refreshMyCustomModule 您的连接回调中,要么将套接字作为参数传递给它。

于 2013-10-29T18:00:57.213 回答
1

这是因为您在 socket.on('init') 中使用了导致范围问题的异步事件。我相信,如果您从父级传递要使用的参数,它将起作用。例如:

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

    });

};
于 2013-10-29T17:59:45.967 回答