Angular 4如何正确返回void observable

Ale*_*dro 20 rxjs typescript angular

在我的Angular 4应用程序中,我有一个必须返回一个observable的方法,这个方法有3个条件,第一个和第二个条件进行get调用,但是第三个条件不能做任何事情,在这种情况下我也必须返回一个observable因为这个方法是.flatmap运算符的第一部分,所以为了链接flatmap的第二部分,我需要从第一部分开始观察.

我尝试:return new Observable<void>();但我有这个错误:

错误TypeError:无法读取undefined的属性'subscribe'

这是必须调用服务来加载数据的初始方法.

loadModelData() {
      this.customerService.getModelDetail(this.code)
        .subscribe(response => {
          this.selected = response.body as Customer;
        });
    }
  }
Run Code Online (Sandbox Code Playgroud)

这是必须链接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);
      })
  }
Run Code Online (Sandbox Code Playgroud)

这是来自名为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>();
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

jen*_*ent 39

return of(); 不创建流。

然而

return of(void 0);

做。

如果您正在嘲笑并需要返回void. 就像我的生活。[伤心的熊猫]

  • `void 0` 是 `undefined` 的最短写法 (3认同)

Est*_*ask 19

匹配Observable<void>类型的 observable是

Observable.of();
Run Code Online (Sandbox Code Playgroud)

它导致完全 observable 没有值并且类似于Observable.empty()

尽管

new Observable<void>();
Run Code Online (Sandbox Code Playgroud)

不正确,因为它缺少 subscribe 函数参数。可以改为:

new Observable<void>(observer => observer.complete());
Run Code Online (Sandbox Code Playgroud)

  • `Observable.of()` 不会发出单个 undefined,也不会发出任何东西。为此,您需要 `Observable.of(undefined)`。 (26认同)

the*_*RAY 6

你也可以试试:

return of(null);
Run Code Online (Sandbox Code Playgroud)


Ric*_*sen 5

也许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;
);
Run Code Online (Sandbox Code Playgroud)


Fat*_*ajd 0

您可以使用行为观察值。它们有一个初始值,当您订阅它们时,订阅将按照该初始值进行。假设如果第三个条件成立,您想对 Customer 的新实例进行操作,那么您可以这样做:

`

let customer = new Customer();
let subj = new BehaviorSubject<Customer>(customer);
....
if(thirdcondition){
  return subj;
}
Run Code Online (Sandbox Code Playgroud)

`

所以现在当你在此方法上调用 subscribe() 并执行最后一个块时,你就得到了你想要的。默认情况下您可以更改new customer()为您想要的任何内容。