在我的Angular 4应用程序中,我有一个必须返回一个observable的方法,
这个方法有3个条件,第一个和第二个条件进行get调用,但是第三个条件不能做任何事情,在这种情况下我也必须返回一个observable,因为这个方法是.flatmap
运算符的第一部分,所以为了连接flatmap的第二部分,我需要从第一部分开始观察。
我尝试使用:return new Observable<void>();
,但我有这个错误:
错误类型错误:无法读取属性&#39;订阅&#39;未定义的
这是必须调用服务来加载数据的初始方法。
loadModelData() {
this.customerService.getModelDetail(this.code)
.subscribe(response => {
this.selected = response.body as Customer;
});
}
}
这是必须链接2个呼叫的服务方法。
getModelDetail(code) {
const params = new HttpParams().set('projection', 'withBalance');
return this.endPointUrlService.loadMaps(this.entityLink)
.flatMap((res) => {
return this.http.get(this.endPointUrlService.cutLinks(
this.endPointUrlService.map.get('customers')) + '/' + code, {observe: 'response', params: params})
.map((response) => <any>response);
})
}
这是来自名为endPointUrlService的支持服务的方法,checkIfMapIsReady()是必须在第三种情况下返回void observable的方法
loadMaps(entityLink: EntityLink[]): Observable<void> {
console.log(entityLink);
for (const i in entityLink) {
if (entityLink.hasOwnProperty(i)) {
return this.checkIfMapIsReady(entityLink[i].name, entityLink[i].searchMap, entityLink[i].endPoints[0])
}
}
}
public checkIfMapIsReady(modelName: string, mapName: string, endPoints: string) {
if (this.map.get(modelName) === undefined) {
console.log('endpoint url service All maps undefined ' + modelName);
return this.getLinks(modelName, this.mapNames.get(mapName), false)
} else {
console.log('endpoint url service Populate only ' + mapName);
if (this.mapNames.get(mapName).get(endPoints) === undefined) {
return this.getLinks(modelName, this.mapNames.get(mapName), true)
} else {
return new Observable<void>();
}
}
}
答案 0 :(得分:7)
return of();
不会创建流。
而
return of(void 0);
确实。
如果您在嘲笑,并且需要返回void
的流。
就像我的生活。 [悲伤的熊猫]
答案 1 :(得分:4)
匹配Observable<void>
类型的可观察对象是
Observable.of();
它导致完全可观察,没有值,类似于Observable.empty()
。
虽然
new Observable<void>();
不正确,因为它缺少订阅函数参数。它可能是:
new Observable<void>(observer => observer.complete());
答案 2 :(得分:3)
也许Observable.empty()
是更好的选择,因为它不会发出任何值,下游运营商不会对它返回的内容产生任何问题!
注意,下游flatMap(res => ...)
和subscribe()
不会触发
既然你没有使用res
,我认为这是理想的效果?
为了更好地衡量,请输入返回类型Observable<any>
。
我 认为 以下内容在逻辑上等同于发布的checkIfMapIsReady()
,
public checkIfMapIsReady(modelName: string, mapName: string, endPoints: string) {
const map = this.map.get(modelName);
const name = this.mapNames.get(mapName);
const endPointCheck = name ? name.get(endPoints) : null;
const links = !endPointCheck
? this.getLinks(modelName, name, !!map) // !! gives boolean true or false
: Observable.empty();
const msg = !map
? 'endpoint url service All maps undefined ' + modelName
: 'endpoint url service Populate only ' + mapName
console.log(msg);
return links;
);
答案 3 :(得分:0)
你可以使用bahaviour observables。它们具有初始值,当您订阅它们时,订阅将对该初始值起作用。所以,如果第三个条件成立,你可以说你想在一个新的Customer实例上运行,所以你这样做:
`
let customer = new Customer();
let subj = new BehaviorSubject<Customer>(customer);
....
if(thirdcondition){
return subj;
}
`
所以现在当你在这个方法上调用subscribe(),并且执行了最后一个块时,你就拥有了你想要的东西。
您可以在默认情况下将new customer()
更改为您想要的任何内容。
答案 4 :(得分:0)
对于RxJS 6.x,您需要这样导入:
import { of } from 'rxjs';
然后使用
return of();
如您所见:没有任何参数意味着可观察到的与Observable<void>
匹配的事物。
答案 5 :(得分:0)
您也可以尝试:
return of(null);