在过去,我会定义一个new Promise
,将其推迟,然后在我的函数完成时解决。现在,我发现自己处于需要Observable
从函数返回a的情况,并且我想确保自己在Angular 5
上下文中正确设置了它。
测试功能,工作正常:
getTreeViewChildren(currNode: any, nodeType: string, nodeTypeEnum: number = 0, nested: boolean = true)
: Observable<any>
{
let treeObs: Observable<any>;
treeObs = new Observable(obs => {
this.siteConfigService.getHostAccessPoints().subscribe(data => {
let hostAccessPoints = JSON.parse(data);
let accPointTree = this.findChildNodes(currNode, hostAccessPoints, nested);
obs.next(accPointTree);
obs.complete();
});
});
return treeObs;
}
从我的NG组件中,我成功订阅了:
this.configService.getTreeViewChildren(this.selectedTreeViewItem, type, nodetype, true).subscribe(tree =>{
let theTree = tree;
});
但是,实函数具有更多的检索逻辑。Observable
按照上述测试功能设置的正确方法是什么?完全相同的模式,只是将所有代码包装在其中treeObs = new Observable(..)
?
getTreeViewChildNodes(currNode: any, nodeType: string, nodeTypeEnum: number = 0, nested: boolean = true): Observable<any> {
let hosts;
let locations;
let hostAccessPoints;
let treeResult: Observable<any>;
if (nodeTypeEnum === NodeType.Location) {
// more code..
let someTree = getStuff();
return someTree;
}
if (nodeTypeEnum === NodeType.Host) {
// more code..
let someTree = getStuff();
return someTree;
}
if (nodeTypeEnum === NodeType.HostAccessPoint) {
let accPointTree;
if (sessionStorage["hostAccessPoints"]) {
// more code..
let someTree = getStuff();
return someTree;
}
else {
this.siteConfigService.getHostAccessPoints().subscribe(data => {
// more code..
let someTree = getStuff();
return someTree;
});
}
}
if (nodeTypeEnum === NodeType.HostStorage) {
// TO DO
}
}
****更新(基于Observable.of()
下面的建议答案):
// Builds hierarchical treeview data
getTreeViewChildNodes(currNode: any, nodeType: string, nodeTypeEnum: number = 0, nested: boolean = true): Observable<any> {
let hosts;
let locations;
let hostAccessPoints;
if (nodeTypeEnum === NodeType.Location) {
if (sessionStorage["locations"] != null && sessionStorage["locations"] != "undefined") {
locations = JSON.parse( sessionStorage.getItem('locations') );
}
// find child nodes
let locationTree = this.findChildren(currNode, locations, nested);
return Observable.of(locationTree);
}
if (nodeTypeEnum === NodeType.Host) {
if (sessionStorage["hosts"] != null && sessionStorage["hosts"] != "undefined") {
hosts = JSON.parse( sessionStorage.getItem('hosts') );
}
// find child hosts for current node
let hostTree = this.findChildHosts(currNode, hosts, nested);
return Observable.of(hostTree);
}
if (nodeTypeEnum === NodeType.HostAccessPoint) {
let accPointTree;
if (sessionStorage["hostAccessPoints"]) {
hostAccessPoints = sessionStorage.getItem("hostAccessPoints");
accPointTree = this.findChildHostAccessPoints(currNode, hostAccessPoints, nested);
return Observable.of(accPointTree);
}
else { // **** THREW ERROR FROM CALLER 'Cannot read property 'subscribe' of undefined****`
/*this.siteConfigService.getHostAccessPoints().subscribe(data => {
hostAccessPoints = JSON.parse(data);
accPointTree = this.findChildHostAccessPoints(currNode, hostAccessPoints, nested);
return Observable.of(accPointTree);
});*/
// ** CORRECTED CODE **
return this.siteConfigService.getHostAccessPoints().map(data => {
hostAccessPoints = JSON.parse(data);
accPointTree = this.findChildHostAccessPoints(currNode, hostAccessPoints, nested);
return accPointTree;
});
}
}
}
并且从我的组件代码中,它TypeError: Cannot read property 'subscribe' of undefined
仅在我调用服务时才引发错误,而服务又依次调用http.get():
this.configService.getTreeViewChildNodes(this.selectedTreeViewItem, type, nodetype, true).subscribe(data => {
this.rebuildNetworkTree(data);
});
对于第二个示例要返回的内容,我无法提供足够的详细信息,但是第一个示例的更好方法是没有任何new Observable(...)
东西。最好只使用map
运算符来转换数据。
getTreeViewChildren(currNode: any, nodeType: string, nodeTypeEnum: number = 0, nested: boolean = true): Observable<any> {
return this.siteConfigService.getHostAccessPoints().map(data => {
let hostAccessPoints = JSON.parse(data);
let accPointTree = this.findChildHostAccessPoints(currNode, hostAccessPoints, nested);
return 'test123';
});
}
从评论更新
如果您有一个有时使用异步操作而有时不使用异步操作的函数,则可以将其Observable.of()
用于非异步返回:
getTreeViewChildNodes(currNode: any, nodeType: string, nodeTypeEnum: number = 0, nested: boolean = true): Observable<any> {
if (doSynchronousWork) {
// more code..
let someTree = getStuff();
return Observable.of(someTree);
}
if (doAsynchronousWork) {
return this.siteConfigService.getHostAccessPoints().map(data => {
// more code..
let someTree = getStuff();
return someTree;
});
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句