节点.js模块级变量未定义
Node.js module level variables are undefined
我在从该模块内部的函数内访问模块级变量的范围时遇到问题。见下文...
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
});
};
看看上面的示例。当我调用刷新我的自定义模块函数时,突然socket
并且myCustomModule
变得未定义。我也尝试使用它以及设置var self = this
.
我已经在客户端上用javascript编写了一堆,但是在node中编码时.js范围似乎有所不同,我只是无法破解这个坚果。
请注意,脚本全局级别的socket
和function connection
中的socket
是两个不同的变量。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
移动到连接回调中,或者将套接字作为参数传入其中。
这是因为您在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
});
};
相关文章:
- Javascript变量未定义,onchange不起作用
- 定义的变量未定义
- 无法弄清楚为什么本机 Promise 变量未定义
- Windows 8 Javascript 疯狂 - 变量未定义
- $rootScope变量未定义
- 变量未定义
- Javascript:TypeError变量未定义
- 变量未定义/超出范围
- javascript变量未定义
- Javascript变量未定义错误
- $scope变量未定义,尽管它是在$watch函数内部设置的
- 类型错误:变量未定义
- AngularJs $http变量未定义
- JQuery:创建扩展返回变量未定义
- d3.js变量未定义,但在Firefox控制台中,它可以工作
- Javascript 中用于上传表单数据的变量未定义
- 节点.js模块级变量未定义
- Node.js req.session 变量未定义
- 错误:AngularJs 变量未定义,当使用 grunt 运行时.(泽泽尔)
- 将字符串拆分为两个变量 - 未定义不是一个函数