改变可观察值

Zac*_*scs 3 javascript rxjs typescript

如果我有一个观察到的student: Observable<Student>,其中Student有参数name: string设置为Jim,如何更改的值namestudents观察到的是Bob

编辑:

student.map(student => student.name = 'Bob')应该的工作。因为如果是,那么我的程序还有其他问题。

max*_*992 7

@ZahiC的答案是正确的,但让我解释一下原因。

首先,使用Rxjs,副作用越少越好。不变是你的朋友!否则,当您的应用程序增长时,尝试猜测对象已在何处变异将是一场噩梦。

其次,从Typescript 2.1开始,您可以使用对象传播。这意味着要更新一个学生对象,而不是这样做:

const newStudent = Object.assign({}, oldStudent, {name: 'new student name'});
Run Code Online (Sandbox Code Playgroud)

你可以做:

const newStudent = {...oldStudent, name: 'new student name'};
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您都不会突变原始学生,而是创建具有更新值的新学生。

最后一件事是如何将其与Rxjs结合使用。
map操作是在这里为:取一个值,做你想要做什么用,并返回一个新的,其正在下降的可观察链中使用。

因此,代替:

student.map(student => student.name = 'Bob');
Run Code Online (Sandbox Code Playgroud)

您应该这样做(就像@ZahiC指出的那样):

student.map(student => ({...student, name: 'Bob'}));
Run Code Online (Sandbox Code Playgroud)

并且为了避免阴影变量名称,您可能还需要调用可观察对象: student$

student$.map(student => ({...student, name: 'Bob'}));
Run Code Online (Sandbox Code Playgroud)

编辑:
由于Rxjs 5.5,您不应使用在Observable.prototype上修补的运算符,而应使用管道运算符:

student$.pipe(
  map(student => ({...student, name: 'Bob'})),
  tap(student => console.log(student)) // will display the new student 
)
Run Code Online (Sandbox Code Playgroud)

  • 如果有人想知道为什么上面示例中的水龙头没有触发,那是因为您必须订阅它。 (3认同)
  • 需要注意的是,`map` 函数是在 `'rxjs/operators'` 中声明的。 (2认同)
  • 哦,是的,我本来可以更精确地解释你必须订阅它,但这也是你通过可观察量学到的第一件事之一。@Mickers如果你想了解更多关于谷歌冷与主机可观察值的信息:) (2认同)