Angular 5:从函数返回一个Observable

鲍勃

在过去,我会定义一个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);
    });
丹尼尔·W·斯特林佩尔

对于第二个示例要返回的内容,我无法提供足够的详细信息,但是第一个示例的更好方法是没有任何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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Angular订阅observable然后返回一个新的

Angular Universal RxJs“Observable_1.Observable.throw 不是一个函数”

Angular - rxjs_Observable__WEBPACK_IMPORTED_MODULE_2__.Observable.of 不是一个函数

Angular 5-Observable-将Observable的第一个值设置为表单组

如何从样本数据中返回一个Observable [Angular]

Angular 2 Typescript Observable返回第一个对象结果

Angular RxJS过滤器-返回一个空的或填充的Observable列表

Angular 2 在启动另一个函数之前等待函数返回值

Angular 5-如何忽略更新Observable的一个属性

在 Angular rxjs 服务中,如何从 HttpClient.get 的返回对象的属性中返回一个 observable

Angular 2 - 当返回空的 observable 时,使用 flatmap 的同步 http 调用不会执行下一个调用

Httpular服务中的Angular2 Observable返回一个字符一个字符的错误

从Angular 8中的Observable获取最后一个值

Angular 5 HttpInterceptor this.interceptor.intercept不是一个函数

一个只有在浏览器刷新时才会启动的函数 ANGULAR 5

比较Angular中Observable的上一个值与下一个值

Angular 8 从函数返回 Observable<boolean>

Angular - 将一个 observable 的值分配给另一个 observable 的字段

如何在Angular的另一个函数中调用一个函数

使用NGRX和Angular同步处理依赖于另一个Observable的Observable

Angular - 如何在另一个 observable 中使用 observable 的结果?

Angular - rxjs - 将 Observable 数组转换为另一个 Observable 数组

Angular 在启动其他 Observable 之前等待一个 Observable 完成

如何在 Angular 中显示 Observable-Array 的一个 Observable?

为什么require(“ angular”)返回一个空对象

Angular ActivatedRoute数据返回一个空对象

Angular Typescript toString返回一个对象

Angular 2-date.getMonth不是一个函数

Angular JS TypeError:$ http不是一个函数