Как отправить последнее значение наблюдаемой каждые 1 с - PullRequest
0 голосов
/ 21 января 2019

Я создаю угловое приложение, используя 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 голосов
/ 21 января 2019

Еще раз спасибо за ваш ответ, он приветствуется.

После игры с ответом и поиска в Интернете я нашел решение, которое справится с этой задачей.Я не думаю, что это оптимально, но это работает для моих нужд.

Вот как это выглядит:

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 меняет свое значение на его фактическое значение, таким образом я могу обновить процентное событие, если проект не изменился

0 голосов
/ 21 января 2019

Если я правильно понимаю, у вас есть номер, но вы все равно хотите выдавать его каждую 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

...