angular2 学习笔记 ( rxjs 流 )

RxJS 博大精深,看了好几篇文章都没有明白.

范围牵扯到了函数响应式开发去了... 我对函数式一知半解, 响应式更是第一次听到...

唉...不过日子还是得过...混着过先呗

我目前所理解的很浅, 大致上是这样的概念.

1.某些场景下它比promise好用, 它善于过滤掉不关心的东西.

2.它是观察者模式 + 迭代器模式组成的

3.跟时间,事件, 变量有密切关系

4.世界上有一种东西叫 "流" stream, 一个流能表示了一段时间里,一样东西发生的变化.

比如有一个值, 它在某段时间里从 "我" 变成 "你" 再变成 "他".

而我们可以对这个流进行观察,所以只要它发生变化,我们就会发现然后做任何事情。

5.站在游览器的角度, 服务器推送数据过来, 用户操作界面, timer 都是我们关心的流.

好,来看例子.

我们通过 new Subject 来创建流. 也可以使用 new EventEmitter 或者 BehaviorSubject. 这些都继承了 Subject

EventEmitter 是 ng2 提供的

BehaviorSubject 可以填入初始值

import { Subject } from "rxjs/Subject";
private textEmitter: Subject<string> = new Subject(); 

要改变流中的值,我们使用 .next(value), 这个是迭代器的概念咯

keyup(value : string)
{
    this.textEmitter.next(value);
}

那么订阅是这样的

ngOnInit() {
    this.text$ = this.textEmitter
        .debounceTime(500)
        .distinctUntilChanged()
        .switchMap(v => this.getDataAsync(v));

    this.text$.subscribe((value) => {
        console.log(value);
    });
}

input keyup 性能优化, 我们通常会写一个 timeout + cleartimeout 的方式, 这个 debounceTime 就是干这个的

流更新结束后 500ms 才会通知观察者

distinctUntilChanged 是说只有当值和上一次通知时的值不一样的时候才通知观察者

.map 和 .switchMap 都是用来对值进行处理的, 这个和 array.map 概念是一样的

而 .map 和 .switchMap 的区别是 .swichMap 处理那些返回 Observeable 的值

getDataAsync(value : string): Observable<string>
{
    let subject = new Subject();
    setTimeout(() => {
        console.log("after 2second");
        subject.next(value + "final");
    }, 2000);
    return subject;
}

如果我们使用 map 的话,它会直接返回 "subject" 这个对象, 而如果用 switchMap 它会返回这个 subject 对象的响应值.

<input type="text" #input (keyup)="keyup(input.value)" />
<p>{{ text$ | async }}</p>

ng2 提供了一个 async Pipe, 它会监听左边这个 text$ stream. 后面加一个 $ 符号通常用来表明这是一个 stream.

还有一个常用的功能是 combineLatest

就是可以同时监听多个流,只要其中一个有变动,那么所有的最新值都会发布出去, 可以用来实现依赖属性.

@Component({
    selector: "compute-property",
    template: `
        <input type="text" #input1 (keyup)="text1.next(input1.value)" />
        <input type="text" #input2 (keyup)="text2.next(input2.value)" />
        {{ result$ | async }}
    `
})
export class ComputePropertyComponent implements OnInit {

    text1: BehaviorSubject<string> = new BehaviorSubject<string>("a");
    text2: BehaviorSubject<string> = new BehaviorSubject<string>("b");
    result$: Observable<string>;
    constructor() {}

    ngOnInit() {
        this.result$ = Observable.combineLatest(this.text1, this.text2).map(values => {
            return values[0] + " " + values[1];
        });
    }
}

还有 bufferCount, bufferTime 也是常用到

text: Subject<number> = new Subject<number>();

ngOnInit() {
    this.text.bufferCount(2)
        .subscribe(v => console.log(v)); //[v1,v2] 存够 count 了就发布

    this.text.bufferTime(2000)
        .subscribe(v => console.log(v)); //[v1,v2,...]把 2 秒内的所有 next value 放进来
}

Observable.of 可以简单的返回一个默认值

Observable.of<string>("").subscribe(v => console.log(v));

rxjs 整个文档非常大,要按需加载.

通常做法是为项目开一个 rxjs-operators.ts

import ‘rxjs/add/observable/throw‘;
import ‘rxjs/add/observable/combineLatest‘;
import ‘rxjs/add/observable/from‘;
import ‘rxjs/add/observable/of‘;
import ‘rxjs/add/operator/catch‘;
import ‘rxjs/add/operator/debounceTime‘;
import ‘rxjs/add/operator/distinctUntilChanged‘;
import ‘rxjs/add/operator/map‘;
import ‘rxjs/add/operator/switchMap‘;
import ‘rxjs/add/operator/toPromise‘;
import ‘rxjs/add/operator/startWith‘;
import ‘rxjs/add/operator/bufferCount‘;
import ‘rxjs/add/operator/bufferTime‘;

放入常用的方法

然后再 app.module.ts 里面导入它

import ‘./rxjs-operators‘; 
时间: 2024-08-11 05:35:35

angular2 学习笔记 ( rxjs 流 )的相关文章

java 学习笔记之 流、文件的操作

ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import java.io.FilenameFilter; public class Test1 { public static void main(String[] args) { File file=new File("F:\\2017-2018-1\\javase"); // //获取该目录下

Angular2学习笔记——Observable

Reactive Extensions for Javascript 诞生于几年前,随着angular2正式版的发布,它将会被更多开发者所认知.RxJs提供的核心是Observable对象,它是一个使用可观察数据序列实现组合异步和事件编程. 跟这个很类似的异步编程模型是Promise,Promise是基于状态变化的异步模型,一旦由等待状态进入成功或失败状态便不能再次修改,当状态变化时订阅者只能够拿到一个值:而Observable是基于序列的异步编程模型,随着序列的变化,订阅者可以持续不断的获取新

Angular2学习笔记四(之Http通信)

前言: 在这里,我描述三个场景,即系统的注册与登录,及登录后的操作: 1.注册场景,前端页面传入用户名密码,通过一个api接口传到后台,在后台对这用户及密码进行保存: 2.登录场景,前端用户传入用户名及密码,通过api接口传到后台,在后台进行配对,如果配对成功,则在后台派发(返回)一个令牌(id_token,下同),通过这个令牌作为用户已经登录的唯一凭证,需要保存到用户本地存储(localStorage),以后作后续操作: 3.登录后操作,当用户需要授权操作时,那么首先得获取本地存储(local

Angular2学习笔记——在子组件中拿到路由参数

工作中碰到的问题,特此记录一下. Angular2中允许我们以`path\:id\childPath`的形式来定义路由,比如: export const appRoutes: RouterConfig = [{ path: 'app/:id', component: AppComponent, children: [ { path: 'share', component: AppShareComponent }, { path: 'issue', component: AppIssueCompo

angular2 学习笔记 ( DI 依赖注入 )

refer : http://blog.thoughtram.io/angular/2016/09/15/angular-2-final-is-out.html ( search Dependency Injection ) 小说明 : 大致流程 : 把 providers 写入 injector, 然后通过 injector 来注入 service. 单列 : 一个 service 在一个 injector 里是单列. 查找逻辑 : injector 有父子关联, 如果子 injector 没

java学习笔记 处理流之数据流

以前写数据如double类型 3.1415926,写进文件必须把这个Double类型转换成字符串写进去,这样做一是比较麻烦,二是如果数据比较长,那么占用内存空间会很大(实际上一个Double类型在内存中占用64位既8个字节). DataOutputStream和DataInputStream类的适用来解决这一问题,可以把这8个字节直接写入内存里面. DataOutputStream和DataInputStream类都是处理流,既包在管道上的管道. 操作示例 import java.io.*; p

Angular2学习笔记——路由器模型(Router)

Angular2以组件化的视角来看待web应用,使用Angular2开发的web应用,就是一棵组件树.组件大致分为两类:一类是如list.table这种通放之四海而皆准的通用组件,一类是专为业务开发的业务组件.实际开发中大部分时间我们都需要处理业务组件.对于SPA应用来说,一个通用的问题就是如何控制页面的切换,解决这个问题的通用方法就是利用路由器来实现. 路由配置 现在我们先撇开Angular2来看看通用的路由器模型.通常来讲SPA应用需要路由配置信息: [ { path: '', pathMa

Angular2学习笔记——NgModule

在Angular2中一个Module指的是使用@NgModule修饰的class.@NgModule利用一个元数据对象来告诉Angular如何去编译和运行代码.一个模块内部可以包含组件.指令.管道,并且可以将它们的访问权限声明为公有,以使外部模块的组件可以访问和使用到它们. 模块是用来组织应用的,通过模块机制外部类库可以很方便的扩展应用,Rc5之后,Angular2将许多常用功能都分配到一个个的模块中,如:FormModule.HttpModule.RouterModule. NgModule的

angular2 学习笔记 ( Http 请求)

refer : https://angular.cn/docs/ts/latest/guide/server-communication.html https://xgrommx.github.io/rx-book/index.html 概念上没什么太多的区别. 下面记入一些例子和小区别 : 不同的地方 : 1.不支持 upload file (游览器的 xhr 可以很容易的通过 send formData 实现 ajax upload), ng2 没有 2.不支持 ng1 的 intercep