observable与Observer

<div class="demo">
    <section class="m-auto theme-light">
        <button class="btn btn-primary" (click)="newObservable()">newObservable</button>
        <button class="btn btn-info" (click)="concat()">concat</button>
        <button class="btn btn-secondary" (click)="cancelObservable()">cancelObservable</button>
    </section>
</div>
import { Component } from '@angular/core';
import { map, Observable, interval, from, concat, filter, reduce, scan, tap } from 'rxjs'

// const sub = interval(2000).subscribe(res => {
//   console.log('interval', res);
// });

@Component({
  selector: 'app-example',
  templateUrl: './example.component.html',
  styleUrls: ['./example.component.less']
})
export class ExampleComponent {
  show: boolean = true
  constructor() { }

  newObservable() {
    // Observable负责从数据源中推送数据(推流),类似Promise
    // const o = new Observable(subscriber => {
    //   console.log('initial a newObservable');
    //   subscriber.next(['a', 'b', 'c']);//相当于promise的resolve
    // }).pipe(
    //   map(res => {
    //     console.log('第一个map');
    //     return res;
    //   }),
    //   map(res => {
    //     console.log('第2个map');
    //     return res;
    //   })
    // );  // 不订阅,pipe中的所有函数都不会触发

    //Observable变量要以$结尾,规范而已.
    // 不订阅(调用subscribe),pipe中的所有函数都不会触发
    const observable$ = new Observable(subscriber => {
      console.log('aaa');

      subscriber.next(1)
      subscriber.next(2)
      subscriber.next(3)//相当于promise的resolve
      setTimeout(() => {
        subscriber.next(300); // happens asynchronously
        subscriber.complete()// // 不调用complete方法,下面的observable.subscribe就不会输出complete
        // 推送结束时触发(即使出现error),不会收到任何值
        subscriber.next(300);
        subscriber.error('error');

      }, 1000);
    })
    console.log('before');

    //订阅observable$后会执行。相当于promise的then。
    // Observable相当于推流。observable$相当于Observer(拉流)。下面是完整写法
    observable$.subscribe({
      next(value) {
        console.log('value', value);
      },
      error(error) {
        console.log(error);
      },
      complete() {
        console.log('complete');
      }
    })
    console.log('after');

  }
  //手动取消
  cancelObservable() {
    // sub.unsubscribe()
  }
  concat() {
      //Observable变量要以$结尾,规范而已.
    const arr1$ = from([1, 8, 9])
    const arr2$ = from([6, 2, 3])
    concat(arr1$, arr2$)
      .pipe(
        filter(item => item > 2),//返回大于2的数
        //  scan((s,v)=>s+v,0)//必须要和num类型相加。返回每一次计算结果
        reduce((s, v) => s + v, 0),//必须要和num类型相加。返回计算最后的结果
        tap(item => {  //用于调试
          console.log(item);

        })

      )
      .subscribe(res => {
        console.log(res);

      })
  }
}

 取消订阅

 

observable.subscribe返回一个Subscription对象

const subscription = observable.subscribe(x => console.log(x)); // 调用subscription.unsubscribe()即可取消订阅 const observable = interval(1000); const subscription = observable.subscribe(x => console.log(x)); setTimeout(() => { subscription.unsubscribe(); }, 5000);

 

  

 

posted @ 2023-03-11 23:08  赵辉Coder  阅读(19)  评论(0编辑  收藏  举报