2015-05-26 2 views
-2

Я играю с узлом/javascript. Это всего лишь простой код, логика не важна, просто играя с EventEmitter. Может кто-то, пожалуйста, скажите мне, что я делаю неправильно с точки зрения кода, а не логики.Узел/Javascript с раскрывающимся шаблоном модуля

Спасибо за помощь.

var emitter = require('events').EventEmitter; 
var http = require('http'); 


function github() 
{ 
    var emitterInstance = new emitter(); 

    this.getEmitter = function() 
    { 
     console.log('returning the emitterInstance'); 
     return emitterInstance; 
    }; 

    this.getData = function() 
    { 
      http.get("https://api.github.com/users/loneshark99/gists", function(error,resp) 
      { 
       if(error) 
       { 
        console.log('Error occured!'); 
       } 
       else 
       { 
        emitterInstance.emit('dataReceived'); 
       } 
      }); 
    }; 

    return { 
    emt : getEmitter, 
     getData : getData 
    }; 
} 

var g = new github(); 
g.emt().on("dataReceived", function() { console.log('data received from github')}) 
g.getData(); 

Ошибка:

D:\test.js:33 
     getData : getData 
       ^
SyntaxError: Unexpected token : 
    at exports.runInThisContext (vm.js:73:16) 
    at Module._compile (module.js:443:25) 
    at Object.Module._extensions..js (module.js:478:10) 
    at Module.load (module.js:355:32) 
    at Function.Module._load (module.js:310:12) 
    at Function.Module.runMain (module.js:501:10) 
    at startup (node.js:129:16) 
    at node.js:814:3 

Ответ :: Это работает

var emitter = require('events').EventEmitter; 
var http = require('http'); 


function github() 
{ 
    var emitterInstance = new emitter(); 

    this.getEmitter = function() 
    { 
     console.log('returning the emitterInstance'); 
     return emitterInstance; 
    }; 

    this.getData = function() 
    { 
      http.get("http://pluralsight.com", function(resp) 
      { 
       emitterInstance.emit('dataReceived'); 
      }); 
    }; 


    var obj = { emt : getEmitter, getData : getData }; 

    return obj; 
} 

var g = github(); 
console.log(g); 
g.emt().on("dataReceived", function() { console.log('data received from github')}) 
g.getData(); 
+1

Что заставляет вас думать, что это неправильно? что не работает? –

+0

Typo? 'g.getEmitter.On' должен быть' g.emt.On' – PSL

+0

@PSL исправил это, но это не проблема – Ben

ответ

2

Есть много проблем с кодом:

var emitter = require('events').EventEmitter; 

Я бы рекомендовал следовать JavaScript соглашения об именовании, и заглавные имена конструкторов. Emitter это должно быть.

this.getEmitter = function() { 

Ваша функция, кажется, должен быть завод, а не функция конструктора. Для выявления шаблона модуля вы используете локальные объявления для своих функций и переменных, вместо того, чтобы добавлять свойства к this. Вы просто возвращаете литерал объекта с экспортированными значениями в конце.

emitterInstance.emit('dataReceived'); 

Поскольку цель вашего кода, кажется, что данные могут быть получены, вы должны фактически распространяться полученные данные. Передайте его обратно контроллеру, передав resp в качестве аргумента для испускаемого события. Сделайте это var getEmitter = function() {, или даже лучше function getEmitter() {.

return 
{ 

АСИ ударит вас здесь. Тяжело.Don't use Allman bracket style in JavaScript, но поставьте фигурные скобки на одной линии.

emt : getEmitter, 

Это не совпадает с розарий. Должно ли имя метода действительно быть emt?

new github(); 

Как было сказано выше, github функция фабрика, которая делает возвращает объект, а не конструктор, который создает экземпляры, которые наследуют от прототипа. Не используйте здесь new, просто вызовите функцию.

g.getEmitter.On 

Чтобы получить событие эмиттер Например, вам нужно будет назвать свой метод. И On должно быть on.

+0

Я установил опечатку для включения. и спасибо за соглашения. оцените – Ben

+0

исправленный возврат также, такая же ошибка – Ben

+0

Ах, спасибо за включение в сообщение сообщения об ошибке. Эта ошибка, по-видимому, подходит для случая разрыва строки, поскольку 'emt:' является допустимой меткой, а 'getData' после запятой больше. Если вы исправили ASI, я больше не могу это объяснить, убедитесь, что вы правильно сохранили свой файл, а узел не кэширует источник модуля. – Bergi

1

Проблема заключается в том new github() возвращается this. Попробуйте:

var g = github(); 

Я удвоит чек и убедитесь, что emitter предназначен для обновленного вверх.

0

getEmitter должно быть getEmitter(), но даже если вы это сделаете из сферы видимости. Вы можете назначить эти функции прототипа github так:

this.getEmitter = function() { 
    console.log('returning the emitterInstance'); 
    return emitterInstance; 
}; 

Кроме того, On должен быть on.

То же самое нужно сделать и по вызову g.getData().

Альтернативой было бы определить это нравится:

github.prototype.getEmitter = function() { ... }

+0

Я понимаю, что это можно сделать с помощью прототипа или этого ключевого слова. Я пытаюсь понять, что не так в коде. – Ben

+0

'g.getEmitter' не определен. 'g.getData' не определен. –

+0

Именно поэтому мой вопрос, если они будут обернуты – Ben

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