JavaScript回调或观察者

时间:2017-08-07 08:10:11

标签: javascript callback

这是关于javascript的一般问题。我想要实现的目标,但我不知道以下是否可能。

我想写一个包含对象的javascript库。因此,通过使用这个javascript库我想通过执行以下操作从另一个javascript文件实例化对象:

myObject = new myObject();

我通过在我的javascript库中编写一个函数来实现这一点:

function myObject() {
    //init object logic
}

问题是,现在我希望能够从之前实例化该对象的javascript文件中侦听该对象的不同事件。类似的东西:

myObject = new myObject();

myObject.on('connection', function(conn) {
             conn.on('data', function(data){

                    console.log("conn on data");

                });

                conn.on('error', function(data){

                    console.log("conn on error");

                });

            });

我怎样才能在javascript中实现这一目标?我在考虑回调,但我无法弄明白。

2 个答案:

答案 0 :(得分:3)

您正在寻找可以这样实现的public static Bitmap getBitmapFromString(String qrText) { ByteArrayOutputStream out = QRCode.from(qrText).to(ImageType.PNG).withSize(300, 300).stream(); byte[] data = out.toByteArray(); Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length, null); return bmp; }

EventEmitter

您的班级可以继承class EventEmitter { constructor () { this.events = {}; } on (channel, cb) { if (Array.isArray(this.events[channel])) { this.events[channel].push(cb); } else { this.events[channel] = [cb]; } } emit (channel, ...args) { if (Array.isArray(this.events[channel])) { this.events[channel].forEach(cb => cb.apply(null, args)); } } }

EventEmitter

现在,您可以实例化您的课程:

class MyClass extends EventEmitter {
  constructor () {
    super();
    // do initialization
  }
}

工作示例:

var myObject = new MyClass();
myObject.on('event', function (a, b) {
  console.log('Event A was emitted: ', a + b); 
});
myObject.emit('event', 123, 456); // "Event A was emitted: 579"

请注意,我使用了一些新功能,例如扩展运算符(class EventEmitter { constructor () { this.events = {}; } on (channel, cb) { if (Array.isArray(this.events[channel])) { this.events[channel].push(cb); } else { this.events[channel] = [cb]; } } emit (channel, ...args) { if (Array.isArray(this.events[channel])) { this.events[channel].forEach(cb => cb.apply(null, args)); } } } class MyClass extends EventEmitter { constructor () { super(); // do initialization } } var myObject = new MyClass(); myObject.on('event', function (a, b) { console.log('Event A was emitted: ', a + b); }); myObject.emit('event', 123, 456); // "Event A was emitted: 579")和新的...语法。当然,您也可以使用旧的classfunction方式实现相同的目标。

在您的代码中,您有

prototype

不要那样做。您将新实例分配给包含构造函数的变量,从而失去对该构造函数的访问权。

NodeJS有自己的EventEmitter类。您可以使用以下方式访问它:

myObject = new myObject();

答案 1 :(得分:1)

//文库

      function myObject() {
         //init object logic
      }

      myObject.prototype.attach=function(eventType,callBack){
          //default event
          document.addEventListener(eventType,callBack);
           ......

            //custom event code
            var event = new Event('connection');

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

      }

// userfile的

      myObject = new myObject();

      myObject.attach("click",clikeMe);
      function clickMe(eventObject){
        .......
        ......
       }

//发送自定义事件

        document.dispatchEvent(event)