【问题标题】:Angular RXJS retry a task based on a valueAngular RXJS 根据值重试任务
【发布时间】:2019-11-26 17:11:09
【问题描述】:

好的,所以我有一个服务来检查是否已加载特定的第 3 方 JS 插件。我想监听它何时进入 DOM,同时它处于未定义状态。我怎么做?到目前为止,我已经尝试过使用一个主题并定期重试,但我无法让它工作:

$apiReady: Subject<boolean> = new Subject();

RegisterOnNewDocumentLoadedOnDocuViewareAPIReady(reControl: any): any {

            this.$apiReady.asObservable().subscribe((isReady: boolean) => {
                if (isReady) {
                       //Do something
                    return of(isReady);
                }
            })
            let IsreControlInitialized = ThirdPartyAPI.IsInitialized(reControl);
            if (IsreControlInitialized) {
                this.$apiReady.next(true);
            }
        return throwError(false);
    }

然后在组件中:

this._apiService.RegisterOnAPIReady(this.elementID).pipe(
                 retryWhen(error => {
                   return error.pipe(delay(2000));  //<---- Doesn't work
              })).subscribe((response: boolean) => {
                if (response) {
                    //Do some stuff
                 }
              });

我的意图是检查 API 元素是否已加载,如果没有在 2 秒内重试,但这是行不通的,谁能帮忙?

【问题讨论】:

    标签: javascript angular rxjs observable subject-observer


    【解决方案1】:

    在满足某些条件之前抛出和捕获错误对我来说有点违反直觉。

    我的方法包括使用interval 运算符和takeUntil 运算符。

    apiReady = new Subject();
    
    interval(2000) // Check every 2s
     .pipe(
      map(() => this.isApiReady())
      takeUntil(this.apiReady)
     )
     .subscribe(isReady => {
      if (isReady) {
       this.apiReady.next();
       this.apiReady.complete();
      }
     })
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多