staffID
@staffID

Как создать реализацию событий?

function f() {
 this.n = 'name';
 this.onn = null;
if ( this.onn ) {
 this.onn();
}
};
var of  = new f();
of.onn = function() {
 console.log( 1 );
};


Код должен вывести 1 в консоль.
Как к примеру сокеты.
var socket = new WebSocket( "example.com:8081" );

socket.onopen = function() {
    console.log( 1 );
}


Или же нужно как-то создавать событие.
Чтобы код выше работал?
  • Вопрос задан
  • 209 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Из вашего вопроса не до конца ясно, чего конкретно вы хотите добиться, но давайте рассмотрим пример с WebSocket.

Используя современные возможности javascript, реализовать такое поведение довольно просто:
  1. Создаём новый экземпляр "класса" MyWebSocket.
  2. Сразу же запускаем подключение по указанному адресу.
  3. Подключение - асинхронная операция, поэтому возвращаем Promise.
  4. Объявляем свойство onopen так, чтобы при задании ему значения вызывалась функция-сеттер.
  5. Внутри сеттера говорим, что callback (та функция, которую пользователь записал в onopen) должен вызваться после того, как promise, возвращаемый методом connect, выполнится (обработку ошибок для упрощения не рассматриваем). Так как промисы состоят в равных пропорциях из радуги, пыльцы фей и слёз единорогов, callback мы можем установить в любой момент - если соединение ещё не установлено, наша функция дождётся, если соединение уже установлено в прошлом, функция будет выполнена сразу же.
  6. В данном случае мы делаем двухсекундную задержку соединения. Попробуйте убрать setTimeout - код будет работать как ни в чём не бывало.
  7. Наконец, вызывается наша функция-callback.

var MyWebSocket = function(url) {
  this.url = url;

  this.connection = this.connect();  // 2

  Object.defineProperty(this, 'onopen', { // 4
    set: function(cb) {
      this.connection.then(cb.bind(this)); // 5
    }
  });
}

MyWebSocket.prototype.connect = function() {
  console.log('connecting to %s', this.url);

  return new Promise(function(resolve, reject) {  // 3
    setTimeout(resolve, 2000); // 6
  });
}

var socket = new MyWebSocket('example.com:8081'); // 1

socket.onopen = function() {
  console.log('connection to %s established', this.url); // 7
}

https://jsfiddle.net/koceg/p2utcp9j/
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Судя по примеру в вопросе, Вам нужно получить функцию извне и вызвать ее в Вашей функции, для это не обязательно нужны события, достаточно использовать колбэк:
function F(cb) {
  this.n = 'name';
  if(typeof cb === 'function') {
    cb.call(this);
  }
}

var of  = new f(function() {
  console.log(1);
});


Если все же нужны события, воспользуйтесь любой реализацией EventEmitter'а коих полно на npm
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы