2012-01-09 3 views
1

Я пытаюсь использовать метод настраиваемого объекта, чтобы испускать соединение сокета. Объект определяется вне соединения сокета, но затем создается внутри него. Далее следует код и ошибка.Невозможно испускать метод, определенный за пределами соединения сокета

app.js

... 
io.sockets.on('connection', function (socket) { 
    report = new Report(); 

    socket.on('dataChange', function(newData) { 
    report.update(newData); 
    }); 
}); 

function Report() { 
    this.update = function (data) { 
    socket.emit('updateReport', { data: data }); 
    } 
} 

Ошибка

Узел дает мне следующую ошибку.

socket.emit('updateReport', { data: data });
^

ReferenceError: socket is not defined

ответ

4

Вы могли бы передать socket в Report, как это:

io.sockets.on('connection', function (socket) { 
    report = new Report(socket); 

    socket.on('dataChange', function(newData) { 
    report.update(newData); 
    }); 
}); 

function Report (socket) { 
    this.update = function (data) { 
    socket.emit('updateReport', { data: data }); 
    } 
} 

Таким образом, socket доступен в Report.

Однако вы использовали report как переменную, которая находится в , а не. Вы уверены, что не переписываете report через соединения? Кажется, вам больше нужен отчет за соединение. В этом случае добавьте var в назначение report.

+0

Это именно то, что мне нужно, и теперь я понимаю, как этот шаблон должен работать. Кроме того, вторая часть вашего вопроса определенно спасла головную боль в будущем. – Travis

+0

можете ли вы поставить «socket.on» в функцию «Отчет»? Будет ли выполняться обратный вызов при запуске события? –

+0

@ The Hawk: Да, вы можете. Но вместо 'report' вам нужно будет определить' var instance = this; 'в' Report', а затем получить доступ к 'instance' обработчику' dataChange'. – pimvdb

Смежные вопросы