繁体   English   中英

在 Angular 9 的回调中分配 observable

[英]Assign observable within callback in Angular 9

我完全是 Angular 的新手。 现在我被困在这里,有些如何努力让初始代码正常工作。
用例:显示加载栏。 将商家列表获取到可观察对象。 停止加载栏。

问题:

fetchUsers($event) {
    let searchTerm = $event.term;
    if (searchTerm.length > 3) {
      this.isLoading=true;
      this.people$ = null;
      this.userService.getMerchantsBySearch(searchTerm);
  --> this.isLoading=false;
   }
}

this.isLoading 甚至在从 getMerchantsBySearch 调用获得响应之前就变为 false。 我知道我需要在回调中执行此步骤,但我不确定如何执行。

我想做这样的事情,但我错过了一些东西。 什么是正确的方法。

fetchUsers($event) {
    let searchTerm = $event.term;
    if (searchTerm.length > 3) {
      this.isLoading=true;
      this.people$ = null;
      this.userService.getMerchantsBySearch(searchTerm).subscribe(
        res={
    --->  this.people$ =res;
    --->  this.isLoading=false;
        }
      );
    }
  }

仪表板.component.ts

people$: Observable<IMerchant[]>;

fetchUsers($event) {
    let searchTerm = $event.term;
    if (searchTerm.length > 3) {
      this.isLoading=true;
      this.people$ = null;
      this.userService.getMerchantsBySearch(searchTerm);
      this.isLoading=false;
    }
}

用户服务.ts

getMerchantProfile(id){
    var options = this.getOptions();
    return this.http.get<IMerchant[]>(environment.APIBaseURL+"/getMerchantProfile/"+id,options);
}

商人.model.ts

export interface IMerchant{
    email:String,
    mobile : String,
    password: String,
    businessName : String,
    otp:Number,
    info:string,
    url:String
}

我更喜欢使用拆卸方法.add() 它不会污染您的 pipe 数据操作链,并且在处理错误后也会执行:

this.userService.getMerchantsBySearch(searchTerm)
    .pipe(
        // manipulate data here
    )
    .subscribe(
        res => {
            // handle final data
        },
        error => {
            // handle error
        }
    ).add(() => {
        // teardown here (e.g. this.isLoading=false;)
    });

顺便说一句:如果this.people$是可观察的,则不能在订阅回调中分配它。 您需要将其分配给您正在使用的 userService 方法的响应。 注意不要在 stream 上调用 subscribe ,因为它会返回一个订阅而不是 observable:

this.people$ = this.userService.getMerchantsBySearch(searchTerm).pipe(...)

您实际上可以pipe它并添加一个finalize

this.userService.getMerchantsBySearch(searchTerm)
.pipe(finalize(() => this.isLoading=false))
.subscribe(
    res => {
         this.people$ =res;
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM