为了账号安全,请及时绑定邮箱和手机立即绑定

RXJS去抖动并修改BehaviourSubject

RXJS去抖动并修改BehaviourSubject

MYYA 2021-03-31 10:18:00
我有这项工作,但是我不确定这是否是最好的解决方法。我觉得每种方法都应该有一种更简单的方法-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)      })  }}
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 117 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信