I having trouble to pass multiple parameters through a callback function. For some reason is one of the objects undefined.
How do i define a callback functions with multiple parameters ?
public save() {
let oldStartDate = "2019-01-01";
let newProject = new Project();
newProject.oldStartDate = "2018-01-01";
this.doSomeWork(newProject, this.workFinished_Callback.bind(this), oldStartDate);
}
public doSomeWork(project:Project, callback: (updatedProject: Project, ...param: any[]) => any = null, ...callbackArgs: any[]) {
//Work work..
console.log(project); //This exists..
callback.call(project, ...callbackArgs);
}
public workFinished_Callback(project:Project, oldStartDate: string) {
console.log(project); //This is undefined..
console.log(oldStartDate); //Shows 2018-01-01
}
The problem is how you use call. The first argument to call is the this parameter passed to the function, which since you bind the callback will not be accessible in the callback. You can pass null as the first argument and pass the project as the second argument and spread the rest of the arguments as the other arguments:
callback.call(null, project, ...callbackArgs);
A better approach would be to not use call. You can just call the function as you normally would:
callback(project, ...callbackArgs);
You can also build a fully type safe version of your code. In 3.2 bind is correctly typed if you enable strictBindCallApply (read PR). This means that we can use bind and get a correctly typed function. Pair this with tuples in rest parameters (PR) and we can get the compiler to check things fully for us:
class Project { oldStartDate!: string }
type DoSomeworkCallbackArgs<T extends (updatedProject: Project, ...param: any[]) => any> =
T extends (updatedProject: Project, ...param: infer A) => any ? A : []
class DD {
public save() {
let oldStartDate = "2019-01-01";
let newProject = new Project();
newProject.oldStartDate = "2018-01-01";
this.doSomeWork(newProject, this.workFinished_Callback.bind(this), oldStartDate);
this.doSomeWork(newProject, this.workFinished_Callback.bind(this), 0); //error
}
public doSomeWork<T extends null | ((updatedProject: Project, ...param: any[]) => any)>(project: Project, callback: T = null, ...callbackArgs: DoSomeworkCallbackArgs<T>) {
//Work work..
console.log(project); //This exists..
if (callback) callback(project, ...callbackArgs);
}
public workFinished_Callback(project: Project, oldStartDate: string) {
console.log(project); // ok now
console.log(oldStartDate); //Shows 2018-01-01
}
}
new DD().save()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With