如何每1秒重新发送一次可观察值的最后一个值

时间:2019-01-21 14:09:35

标签: angular rxjs google-cloud-firestore

我正在使用rxjs和firestore创建一个有角度的应用程序。

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

因为它占用大量资源,所以我只更新可见项目的百分比。

使用开始日期,结束日期和当前日期计算百分比。因此,如果我们正在进行项目的一半,则该百分比将指示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)

    })

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

我如何使可观察对象重新发送最新值,以便如果可观察对象未收到值,它可以更新百分比事件?

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的电话号码,但是无论如何您希望每1秒发出一次,对吧?

python.exe

这会重新发出每秒可观察到的源中的最后结果。

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

答案 1 :(得分:0)

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

在找到答案并在线查找后,我找到了解决问题的解决方案。我认为它不是最佳选择,但它可以满足我的需求。

这是它的样子:

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将他的值更改为他的实际值,这样即使项目未更改,我也可以更新百分比事件