在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');

现在我注意到问候者1。On函数接受带参数的回调。然而,我不确定这是如何实现内部。我试着通过nodejs事件.js文件,但我仍然感到困惑。我知道有一些方法可以绕过这个特定的实现,使用匿名函数用参数包装回调,但我想了解如何使用与上面相同的格式。

tldr:如何创建自己的函数,该函数以与greeter1相同的方式接受回调和参数。以上。

谢谢

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

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 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');

最新更新