【问题标题】:How to resend the last value of an observable every 1s如何每 1 秒重新发送一个可观察对象的最后一个值
【发布时间】:2019-06-14 22:43:41
【问题描述】:

我正在使用 rxjs 和 firestore 创建一个 Angular 应用程序。

我正在处理的功能需要更新项目的百分比。

因为它是资源密集型的,我只更新可见项目的百分比。

百分比是使用开始日期、结束日期和当前日期计算的。因此,如果我们在项目进行到一半时,百分比将显示为 50%。

现在我订阅了该项目,并使用公式计算百分比并将其推送到数据库。问题是,我需要每 1 秒(或任意次数,我只需要它准确)重新计算这个百分比,以便我可以相应地更新百分比。

这就是它的样子:

var date_percentage = this.get("projects","uz9o3cGSHq7q1p7utujq").map(
      res=>{
        if (this.date_percentage_calculator(res.data().start_date,res.data().end_date) >= 100) return 100
        else if (this.date_percentage_calculator(res.data().start_date,res.data().end_date) <= 0) return 0
        else return this.date_percentage_calculator(res.data().start_date,res.data().end_date)
      }
    ).subscribe(calculated_percentage=>{

      this.update_proprety("projects","uz9o3cGSHq7q1p7utujq","percentage",calculated_percentage)

    })

现在项目可能不会被修改,因此更新程序可能只会被调用一次。

如何让可观察对象重新发送最新值,以便在可观察对象未收到值时更新百分比事件?

【问题讨论】:

    标签: angular rxjs google-cloud-firestore


    【解决方案1】:

    如果我理解正确,你有数字,但无论如何你想每 1 秒发出一次,对吧?

    this.get("projects","uz9o3cGSHq7q1p7utujq").map(res => {
      if (this.date_percentage_calculator(res.data().start_date,res.data().end_date) >= 100) 
        return 100
      else if (this.date_percentage_calculator(res.data().start_date,res.data().end_date) <= 0) 
        return 0
      else
        return this.date_percentage_calculator(res.data().start_date,res.data().end_date)
    }).pipe(
      tap(percentage => doForEveryNewValue(percentage)),
      switchMap(percentage => timer(0, 1000).pipe(mapTo(percentage)))
    )
    

    这会每秒重新发送来自可观察源的最后一个结果。

    RxViz:https://rxviz.com/v/j8Ang3ro

    【讨论】:

    • 感谢您的回答,但这并不是我想要的。让我这样说:` var input = Observable.of(1,2,3); var do_somthing = input.subscribe( res=>{ console.log(res) } ) ` 现在我需要 do_somthing 函数来触发每个新值或输入,并使用最新的输入值每秒触发一次。
    • btw subscribe 类似于最后一步 - 你不应该在那里做太多逻辑。
    【解决方案2】:

    再次感谢您的回答,不胜感激。

    在尝试了答案并在网上查找后,我找到了一个可以完成这项工作的解决方案。我不认为它是最佳的,但它可以满足我的需求。

    这是它的样子:

    var temp = new BehaviorSubject(null);

    var temp = new BehaviorSubject(null);
    
    var temp2 = this.sub_to("projects", "uz9o3cGSHq7q1p7utujq").subscribe(
      res=>{
        temp.next({date1:res.payload.data()["start_date"],date2:res.payload.data()["end_date"]})
      }
    )
    
    
    temp.subscribe(
      res => {
        console.log(res)
        setTimeout(function(){ temp.next(temp.value) }, 30000);
        if (res){
          this.update_proprety("projects","uz9o3cGSHq7q1p7utujq","percentage",this.date_percentage_calculator(res.date1,res.date2))
        }
    
      }
    )
    

    temp2 是可观察的项目,当项目更新时,他会更改 temp2 的值,并进行适当的修改。

    现在每 30 秒 temp2 将他的值更改为他的实际值,这样我可以在项目不变的情况下更新百分比事件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 2021-04-14
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2020-12-26
      相关资源
      最近更新 更多