0

Я несколько событий, которые мне нужно слушать с дополнительным событием и передать объект:Создание событий объекта после того, как некоторые данные были

const spawn = require('child_process').spawn; 
const ls = spawn('ls', ['-lh', '/usr']); 

ls.stderr.on('data', (data) => { 
    myObj.data = true 
    //here I need to raise the event with the property data 
}); 

ls.on('close', (code) => { 
    myObj.close = true 
    //here I need to raise the event with the property close 
}); 

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

Допустим, это мой объект

var myObj ={ 
    open:true, 
    data:false, 
    close:true 
} 

Как я могу это сделать?

ответ

0

Очевидным способом является создание собственного собственного излучателя/слушателя событий.

const spawn = require('child_process').spawn; 
const ls = spawn('ls', ['-lh', '/usr']); 

var eventer = { 
    events: {}, 
    on: function(event, callback){ 
     if(!(typeof callback === 'function'){ 
      return; 
     } 
     if(!this.events[event]){ 
      this.events[event] = []; 
     } 
     this.events[event].push(callback); 
    }, 
    trigger: function(event, data){ 
     if(!this.events[event]){ 
      this.events[event] = []; 
     } 
     this.events[event].forEach(function(callback){ 
      callback(data); 
     } 
    } 
} 
var myObj = { 
    open: true, 
    data: false, 
    close: true 
} 

ls.on('close', (code) => { 
    myObj.close = true; 
    eventer.trigger('data-changed', myObj); 
}); 

ls.stderr.on('data', (data) => { 
    myObj.data = true; 
    eventer.trigger('data-changed', myObj); 
}); 

eventer.on('data-changed', (data) => { 
    //action on close 
}); 

Редактировать

Поскольку вы на узле, вы можете использовать EventEmitter, который работает аналогичным образом:

const spawn = require('child_process').spawn; 
const ls = spawn('ls', ['-lh', '/usr']); 
const EventEmitter = require('events'); 
const util = require('util'); 

function MyEmitter() { 
    EventEmitter.call(this); 
} 
util.inherits(MyEmitter, EventEmitter); 

const myEmitter = new MyEmitter(); 
ls.stderr.on('data', (data) => { 
    myObj.data = true; 
    myEmitter.emit('data-changed', myObj); 
}); 
+0

Спасибо Камилле 1+! что мне нужно, и вы можете дать пример с моим контекстом, я хочу его использовать ... (не уверен, что такое ls и как позвонить в ls.on и myObj.on, спасибо! –

+0

ls от вашего примера выше: const ls = spawn ('ls', ['-lh', '/ usr']), я не знаю, где вам нужно отслеживать изменения, если вы можете предоставить пример того, что вы пытаетесь do, я могу добавить больше примеров –

+0

Спасибо ive 3 вопросов :), когда я пытаюсь, я получил ошибку для двух свойств закрытия, которые он определил дважды, 2. есть хороший способ отбрасывать события из объектов, которые означают, что объект будет иметь только логические свойства ... 3. Нужно ли мне требовать, чтобы эмитент узла узла? –

0

Вы можете создавать события, используя Event object/API.

Создание пользовательского события (копирование/вставка из связанного источника)

var event = new Event('build'); 

// Listen for the event. 
elem.addEventListener('build', function (e) { ... }, false); 

// Dispatch the event. 
elem.dispatchEvent(event); 

Вы, вероятно, хотите знать о следующем разделе Документов тоже, что позволяет добавлять пользовательские данные для вас события:

var event = new CustomEvent('build', { 'detail': elem.dataset.time }); 

function eventHandler(e) { 
    console.log('The time is: ' + e.detail); 
} 

Это должно работать во всех современных браузерах, кроме IE11. Если вы посмотрите на документы, есть более длинный пример, показывающий обход для старых браузеров.

+0

Спасибо Мэтью, но мы по-прежнему должны поддерживать IE11 ... любой другой чистый способ сделать это? –

+0

@Mark Я немного отредактировал ответ. Если вы читаете документы немного больше, есть пример решения под заголовком «Старомодный способ», который должен работать для всех браузеров. –

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