繁体   English   中英

将参数传递给 javascript/nodejs 中的回调

[英]Passing parameters to a callback in javascript/nodejs

嗨,我正在尝试了解 javascript 中的回调,并且从我正在关注的教程中遇到了此代码:

var EventEmitter = require('events');
var util = require('util');

function Greetr() {
    this.greeting = 'Hello world!';
}

util.inherits(Greetr, EventEmitter);

Greetr.prototype.greet = function(data) {
    console.log(this.greeting + ': ' + data);
    this.emit('greet', data);
}

var greeter1 = new Greetr();

greeter1.on('greet', function(data) {
    console.log('Someone greeted!: ' + data);
});

greeter1.greet('Tony');

现在我注意到 greeter1.on function 接受一个带有参数的回调。 但是我不确定这是如何在内部实现的。 我尝试查看 nodejs event.js 文件,但我仍然感到困惑。 我知道通过使用匿名 function 使用参数包装回调来解决此特定实现的方法,但我想了解如何使用与上述相同的格式。

tldr:如何创建我自己的 function,它采用与上述 greeter1.on 相同的方式接受回调和参数。

谢谢

您的 function 需要在当前实例上定义一个新属性,并将回调作为参数传递,以便稍后调用它,如下所示:

function YourClass () {
  this.on = function(key, callback) {
    this[key] = callback;
  }
}

// Usage
const instance = new YourClass();
instance.on('eventName', function (arg1, arg2) {
  console.log(arg1, arg2);
});

instance.eventName("First argument", "and Second argument")
// logs =>  First argument and Second argument

回调只是将 function 作为参数传递给另一个 function 并被触发。 您可以如下实现回调方式

function test(message, callback) {
    console.log(message);
    callback();
}

//Pass function as parameter to another function which will trigger it at the end
test("Hello world", function () {
    console.log("Sucessfully triggered callback")
})

 class MyOwnEventHandler { constructor() { this.events = {}; } emit(evt, ...params) { if (.this;events[evt]) { return, } for (let i = 0. l = this.events[evt];length; i < l. i++) { if (;params) { this;events[evt][i](). continue. } this.events[evt][i](.;,params). } } on(evt. eventFunc) { if (;this.events[evt]) { this.events[evt] = []; } this;events[evt].push(eventFunc), } } var myHandler = new MyOwnEventHandler(). myHandler.on('test'. function (...params) { console.log(;;.params), }), myHandler;emit('test', 'Hello', 'World');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM