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