可观察,异步和其他

时间:2018-09-16 08:53:03

标签: angular typescript rxjs observable

经过一整天的努力寻找合适的解决方案后,我终于在这里寻求帮助。

我需要什么 在服务中,我必须提供一个返回对象数组的函数。第一次使用HttpClient从Web服务中检索这些对象,但随后我想将它们存储在本地变量中,以避免每次调用此服务函数时都浪费时间和流量。
最后,我必须在<select *ngFor标签中显示这些对象,并在设置值后设置默认值。

第一次尝试

service.ts

  stati = null;

    getStati() {
      if (this.stati) return this.stati;
      return this.http.get<ApiResponse>(this.apiUrl + 'lists/stati')
        .pipe(
          retry(3),
          map(data => {
            if (data.status === 0)
              this.stati = data.response; // <-- this is an array
            return this.stati;
          }
      ));
    }

request.component.ts

this.svcApi.getStati()
  .subscribe((stati) => {
    this.stati = stati;
    this.request.nascita.stato = 'IT';
    this.request.residenza.stato = 'IT';
  });

request.component.html

<select class="form-control"
        [(ngModel)]="request.nascita.stato" name="stato">
  <option *ngFor="let stato of stati" 
      [value]="stato.codice">{{stato.nome | uppercase}}</option>
</select>

这是第一次唯一,但是当我的路由器(重新)激活路由时,我在组件中收到一条错误消息,指出svcApi.getStati().subscribe不是一个功能;自然,我理解这一点,因为这次我不返回一个Observable而是一个数组!

第二次尝试
所以我尝试更改服务功能:
if (this.stati) return Observable.from(this.stati);

但是当我回到路由时,在控制台中出现此错误:

  

错误错误:找不到其他支持对象'[对象对象]'   类型为“对象”。 NgFor仅支持绑定到Iterables,例如   数组。

第三次尝试
我最后的尝试是也要更改

<option *ngFor="let stato of stati | async"

但是我得到这个错误

  

错误TypeError:无法读取null的属性“ dispose”   AsyncPipe.push

我很确定应该有一个简单的解决方案,但是作为一个新手,我想不到。

1 个答案:

答案 0 :(得分:3)

如评论中所述:

  

而不是if(this.stati)返回Observable.from(this.stati),请尝试:if(this.stati)返回Observable.of(this.stati)

感觉不到实际答案,因此会提供更多上下文:

of(x)等效于from([x])

of基本上包装了传递给任何对象的内容,而没有进行任何修改-of(of)是虚拟的,但完全可以。另一方面,from假定该值的类型为ObservableInput<T> = SubscribableOrPromise<T> | ArrayLike<T> | Iterable<T>;,并将尝试将原始包装器转换为可观察的包装器。例如。 from(42)是不正确的,但是from('42')是-后者发出42completesstring的确是ArrayLike,如果有人认为from的行为像of,这可能会造成混乱。 from似乎有点超载-我个人从不使用SubscribableOrPromise<T>

直观上from可以容易地解释为等同于of。恕我直言,应该有一个像fromArray这样的函数-尤其是因为fromPromise几乎没有用,因为它不是惰性的。在我的用法中,无论如何总是将数组传递给from

一些其他反馈

在干净状态下,如果getStati被多次调用,则将有多个请求发送到服务器,并且缓存永不过期。