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 は 2 つの異なる変数があることに注意してください。あなたの中のものは、接続イベントからその関数に渡され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"});

    });

};

ではなく、で使用するつもりだったとかなり確信ています。その場合は、接続コールバックに移動するかソケットを引数として渡します。socketFromConnectionrefreshMyCustomModulesocketUsedForListenrefreshMyCustomModule

于 2013-10-29T18:00:57.213 に答える