猿问

RXJS去抖动并修改BehaviourSubject

我有这项工作,但是我不确定这是否是最好的解决方法。我觉得每种方法都应该有一种更简单的方法-addTodo,deleteTodoById,updateTodo。


我正在使用BehaviourSubject修改数组,但是在我更新时,我希望消除用户输入(或延迟)并在后台更新本地存储


如何改善和简化RXJS代码?


import { Injectable } from "@angular/core"

import { Todo } from "./todo"

import { BehaviorSubject, Observable } from 'rxjs'

import { take } from 'rxjs/operators'



@Injectable()

export class TodoService {

  todos:  BehaviorSubject<Todo[]> = new BehaviorSubject<Todo[]>([]);

  observable: Observable<Todo[]> =  this.todos.asObservable();


  getTodos(): Observable<Todo[]> {

    try {

      const todos: Todo[] = JSON.parse(localStorage.getItem('todos'))

      if(!todos) {

        return this.todos

      }

      this.todos.pipe(take(1)).subscribe(() => {

        return this.todos.next(todos)

      })

      return this.todos;

    } catch(err) {

      console.log('have no local storage')

    }

  }


  addTodo(todo: Todo): TodoService {

    this.todos.pipe(take(1)).subscribe(todos => {

      this.updateLocalStorage([...todos, todo])

      return this.todos.next([...todos, todo])

    })

    return this

  }


  deleteTodoById(id): TodoService {

    this.todos.pipe(take(1)).subscribe(todos => {

      const filteredTodos = todos.filter(t => t.id !== id)

      this.updateLocalStorage(filteredTodos)

      return this.todos.next(filteredTodos)

    })

    return this

  }



  updateTodo(id, title): void {

    this.todos.pipe(take(1)).subscribe((todos) => {

      const todo = todos.find(t => t.id === id)

      if(todo) {

        todo.title = title

        const newTodos = todos.map(t => (t.id === id ? todo : t))

        this.updateLocalStorage(newTodos)

        return this.todos.next(newTodos)

      }

    })

  }


  updateLocalStorage(todos):void {

    this.todos.subscribe(t => {

      setTimeout(() => {

        localStorage.setItem('todos', JSON.stringify(todos))

      }, 300)

      })

  }

}


MYYA
浏览 118回答 1
1回答
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答