代码之家  ›  专栏  ›  技术社区  ›  Alexander Mills

比较多个行为子对象的最新值

  •  0
  • Alexander Mills  · 技术社区  · 6 年前

    假设我有这个:

      isMatchedCountLessThanTotalCountMessage(){
           // I want to implement this
           // "returns" a string asynchronously
      }
    
      getMatchedEventsCount() {
        return this.dcs.matchCount.asObservable();
      }
    
      getTotalEventsCount() {
        return this.dcs.totalCount.asObservable();
      }
    

    matchedCount和totalCount如下:

      public matchCount = new BehaviorSubject<number>(0);
      public totalCount = new BehaviorSubject<number>(0);
    

    当值发生变化时,这些可观察到的值会触发整数。无论何时从其中一个触发一个值,我都想比较两个最近的值,我该怎么做?

    我要做的是从方法中返回一个布尔值

    因此我可以在HTML中显示:

     <div>{{(isMatchedCountLessThanTotalCountMessage() | async)}}</div>
    

    我认为可以观察到。zip可能会做到:

    isMatchedCountLessThanTotalCountMessage(){
        return Observable.zip(
          this.getMatchedEventsCount(),
          this.getTotalEventsCount()
        )
        .subscribe(function(v){
          const intA = v[0];
          const intB = v[1];
    
            if(intA > intB)
             // but I don't know how to send a message the HTML from here
        });
      }
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   CozyAzure    6 年前

    您可以轻松使用 .map() 用于转换所需数据的函数:

    isMatchedCountLessThanTotalCountMessage() {
        return Observable.combineLatest(
            this.getMatchedEventsCount(),
            this.getTotalEventsCount(),
        )
            .map(([intA, intB]) => {
                return intA > intB ? '(results ARE filtered)' : '(results are not filtered)'
            })
    }
    
        2
  •  0
  •   Alexander Mills    6 年前

    这是可行的,尽管我们可能会使用一些不可观察的东西。拉链

     isMatchedCountLessThanTotalCount() {
        return Observable.create(obs => {
          return Observable.zip(
            this.getMatchedEventsCount(),
            this.getTotalEventsCount()
          )
          .subscribe(v => {
            if ((v[1] - v[0]) > 0) {
              obs.next('(results ARE filtered)')
            }
            else {
              obs.next('(results are not filtered)');
            }
          });
        });
      }
    

    实际上,使用所谓的“投影函数”有一种更简单的方法:

      isMatchedCountLessThanTotalCount() {
        return Observable.combineLatest(
          this.getMatchedEventsCount(),
          this.getTotalEventsCount(),
          function (one, two) {
            if ((two - one) > 0) {
              return '(results ARE filtered)'
            }
            return '(results are not filtered)';
          }
        )
      }
    

    Observable.combineLatest() 类似于 Observable.zip() 但它不会等待来自所有可观察对象的新值,而是会激发第一个新值。