将additionall参数绑定到事件处理程序

时间:2018-05-01 16:36:59

标签: javascript node.js typescript

使用案例

我有一个事件处理程序,它已经传递了一个参数(一个错误对象)。在我绑定事件处理程序的地方,我想传递一个额外的参数。我知道有bind()方法,但我想我会覆盖现有的错误参数。

代码:

const client = new RequestClient(...);

// Here I want to bind the client object so that onClientError gets the
// error and the client object passed
client.onError(this.onClientError); 

private onClientError = (error: Error): void => {
  this.logger.error(`Error on client occured: ${error}`);
};

// And this is how I'd like to use my new event handler
private onClientError = (error: Error, client: RequestClient): void => {
  this.logger.error(`Error on client occured: ${error}`);
};

我的问题:

如果事件处理程序已有现有参数,如何将其他参数绑定到哪个?

1 个答案:

答案 0 :(得分:2)

bind确实是你想要的如果你可以使用额外的参数作为第一个参数而不是第二个:

client.onError(this.onClientError.bind(null, client)); 

private onClientError = (client: RequestClient, error: Error): void => {
  this.logger.error(`Error on client occured: ${error}`);
};

当调用函数bind时,它会调用原始函数,并调用bind后调用的任何参数,然后调用它。因此,如果您bind参数A并且使用参数B调用它,则使用参数A和B(按此顺序)调用原始函数。

如果必须是第二个,最简单的是包装函数:

client.onError(event => this.onClientError(event, client));