我在从所述模块内部的函数内访问模块级变量的范围时遇到问题。见下文......
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函数时socket
和myCustomModule
变得未定义。我也试过使用它以及设置var self = this
。
我在客户端上用javascript编写了一堆,但是当在node.js中进行编码时,似乎范围不同,我只是无法解决这个问题。
答案 0 :(得分: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"});
});
};
我有理由相信你意味着在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
});
};