回调函数中的参数来自哪里? Node.js的

时间:2016-01-26 00:38:03

标签: javascript node.js callback eventemitter

例如,message是一个EventEmitter。回调函数可以接受名为message的参数。我的问题是message来自哪里?事件message是否提供了它?如果是这样,你们可以请给我一个事件chat的样本,让我看看它什么时候被触发,这个参数是如何提供给chat.on('message',function(message){ console.log(message); }); EventEmitter的?非常感谢你们。

//getting img from camera
sendbmp = Tools.getFocusedBitmap(getApplicationContext(), camera, data, focusBox.getBox());
     //converting image to base64
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    jpgbitmap = sendbmp.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    byteArray = stream.toByteArray();
    try {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            mJSONArray = new JSONArray(byteArray);
            base64array = Base64.encodeToString(byteArray,Base64.DEFAULT);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }

1 个答案:

答案 0 :(得分:1)

message参数来自触发事件的任何内容。

您可以在EventEmitter的{​​{3}}中看到onaddListener的同义词:

EventEmitter.prototype.on = EventEmitter.prototype.addListener;

然后你可以看到addListener只是将处理程序放在所提供类型的所有处理程序列表中(简化代码):

EventEmitter.prototype.addListener = function(type, listener) {
  // ...  
  if (!this._events) this._events = {};
  // ...
  this._events[type] = this._events[type] || [];
  this._events[type].push(listener);
  // ...
  return this;
};

然后emit调用相应列表中的每个处理程序:

EventEmitter.prototype.emit = function(type) {
  // ...
  var args = Array.prototype.slice.call(arguments, 1);

  var listeners = this._events[type];
  for (var i = 0, l = listeners.length; i < l; i++) {
    listeners[i].apply(this, args);
  }
  return true;
  // ...

};

因此,当您说.emit('message', "Hello")时,args将为["Hello"],而listeners[i].apply(this, args)会将此参数列表发送到您在自己定义的function(message) { /* ... */ }.on来电:这是message成为"Hello"的方式。