【发布时间】:2019-06-03 22:41:18
【问题描述】:
我想发送一个函数作为参数。当我在另一个函数“this”和“HttpClient”等其他函数中调用它时,“urlBase”是未定义的。
我在互联网上搜索并找到了有关 bind() 属性的信息,但是如果现在定义了“this”,那么其他的仍然是未定义的。所以我把我需要的所有属性都放在了 bind() 函数中,但对我来说看起来很糟糕......
这是我的服务功能,效果很好。
deleteEmpBusArea(employeeId: number, busAreaId: number){
let params = {
empId: employeeId,
bsarId: busAreaId
};
return this.http.delete(`${this.envConfig.baseUrl}/employee/delete-emp-bus-area`, {params: stringify(params)}).pipe(share());
}
这是我想给它另一个函数作为参数的函数:
deleteBusinessArea(area: BusinessArea){
this.utilitiesDialogService.deleteRowFromDialog(area, this.employeeService.deleteEmpBusArea.bind(this, this.http, this.envConfig, stringify));
}
还有前面调用的函数实现
deleteRowFromDialog(element: any, funcCalled: Function){
this.openDeleteDialog(element).afterClosed().pipe(
switchMap((isClosed) => {
if (isClosed === false) {
return funcCalled(element.id);
}
return EMPTY;
}),
takeUntil(this.unsubscribed)).subscribe(() => {
});
}
Stringify 是 .ts 文件中的一个函数,其签名如下:
export function stringify(json: any): any {
///code implementation
}
我期待通过使用绑定属性提供“this”,“this”将获取他所拥有的所有内容(“this.http”、“this.envConfig”等),而不是将它们全部写入 .bind( ) .将它们全部提供绑定是否正确?
另外,stringify 是一个导出函数,我无法在 bind() 属性中发送它并给出错误:
A JS error occurred: Converting circular structure to JSON TypeError: Converting circular structure to JSON
【问题讨论】:
-
你遇到的问题是javascript的特殊性,与范围有关。阅读本文以了解更多信息:javascriptplayground.com/javascript-variable-scope-this
-
bind()适合调用不同环境的函数,所以这正是你需要的。您也有call()和apply(),但当您立即调用函数并想要更改上下文时,它们很有用。
标签: angular spring-boot rxjs