好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

angular Observable

1.回调函数

   /*  * 1.设计实现函数   */  
  print_msg(msg) {
    console.log(msg);
  }

    /*  * 2.设计调用函数,param1:实现函数参数,param2:实现函数本身   */  
  async_read(msg, callback) {
    callback(msg);
  }

  constructor() {
      /*  * 3.调用 调用函数   */ 
     this .async_read( '  我要打印的消息  ' ,  this  .print_msg);
  } 

  这样做可以通过3给2传入不同的函数名而实现不同的操作。

2.Promise

   study_promise() {
      const  p =  new  Promise(resolve =>  {
      resolve(  '  成功回调  '  );
    }).then((res)  =>  {
      console.log(res);
        return   res;
    }).then((res)  =>  {
      console.log(res);
    });
  } 

3.Observable

  

 

3.1先写一个简单的例子,5s内每隔一秒打印一次‘hello’

   constructor() {
      this  .study_observable()
      .subscribe((res)  =>  {
        console.log(res);
      });
  }


  study_observable(): Observable < string >  {
    let i  =  0  ;
      return  Observable.create((observer) =>  {
      setInterval(()  =>  {
        i ++ ;
        observer.next(  '  hello_  '  +  i);
          if  (i ===  5  ) {
          observer.complete();
        }
      },   1000  );
    });
  } 

3.2 of创建Observable 并订阅一个Observer

   ngOnInit() {
      this  .getdata();
  }

  getdata() {
      const  myObservable = of( 1 ,  2 ,  3  );
      const  myObserver =  {
      next: x  => console.log( '  next  '  +  x),
      error: err  => console.error( '  error  '  +  err),
      complete: ()  => console.log( '  complete  '  )
    };
    myObservable.subscribe(myObserver);
  } 

   of创建一个可观察对象,上面的代码等价于

   ngOnInit() {
      this  .getdata();
  }

  getdata() {
      //   const myObservable = of(1, 2, 3); 
     const  myObservable =  new  Observable( this  .sequenceSubscriber);
      const  myObserver =  {
      next: x  => console.log( '  next  '  +  x),
      error: err  => console.error( '  error  '  +  err),
      complete: ()  => console.log( '  complete  '  )
    };
    myObservable.subscribe(myObserver);
  }

  sequenceSubscriber(observer: Observer <any> ) {
    observer.next(  1  );
    observer.next(  2  );
    observer.next(  3  );
    observer.complete();
      return   { unsubscribe() { } };
  } 

3.3 页面 Async 管道

<div>{{time$ |  async }}</div>

  这样写就相当于订阅了time$,会实时接收next过来的值,

  Observable定义如下,用来逐秒打印时间,

  页面接收的值类型为Observable<T>,下方为string

  time$: Observable< string > ;
  ngOnInit() {
      this .time$ =  new  Observable(observer =>  {
      setInterval(()  =>  {
        observer.next(  new   Date().toString());
      },   1000  );
    });
  } 

  若是要接收object对象,需要这样取值

<ng-container *ngIf= "  time$ | async as time  " >
<div> 
  {{time.date}}
  {{time.time}}
 </div>
</ng-container>

  ts:

  time$: Observable< object > ;
  ngOnInit() {
      this .time$ =  new  Observable(observer =>  {
      setInterval(()  =>  {
          const  e =  new   Date();
        observer.next({ date: e.toDateString(), time: e.toTimeString() });
      },   1000  );
    });
  } 

 3.4 Object

  既可以作为Observable、也可以作为Observer

  支持多播

   constructor() {
      const  subject =  new   Subject();
      /*  作为被观察者 支持多播 可以订阅多个观察者   */  
    subject.subscribe(
      {
        next: x  => console.log( '  A:  '  +  x)
      }
    );
    subject.subscribe(
      {
        next: x  => console.log( '  B:  '  +  x)
      }
    );
      /*  发送值   */  
    subject.next(  1  );
    subject.next(  2  );

      /*  Subject作为观察者,可以被Observalbe订阅   */ 
     const  fo = of( 1 ,  2 ,  3  );
    fo.subscribe(subject); 
  }

  结果:

    

 3.5   BehaviorSubject 是 Subject的子类 

  它有一个“当前值”的概念,保存了发送给消费者的最新值。

  并且当有新的观察者订阅时,会立即从  BehaviorSubject  那接收到“当前值”。

   constructor() {
      const  bs =  new  BehaviorSubject( 0  ); // 给一个当前值(初始值)
    bs.subscribe({
      next: v  => console.log( '  A  '  +  v),
    });
    bs.next(  1  );
    bs.subscribe({
      next: v  => console.log( '  B  '  +  v)
    });
    bs.next(  2  );
  } 

  结果:

    

 3.6  ReplaySubject  是Subject的子类

  发送旧值给新的订阅者

   constructor() {
      const  bs =  new  ReplaySubject( 3 );  //   回放三个值 
     bs.subscribe({
      next: v  => console.log( '  A  '  +  v),
    });
    bs.next(  1  );
    bs.next(  2  );
    bs.next(  3  );
    bs.next(  4  );
    bs.subscribe({
      next: v  => console.log( '  B  '  +  v)
    });
    bs.next(  5  );
  } 

  结果:

    

 3.7  AsyncSubject  是Subject的子类

  只有当 Observable 执行完成时(执行  complete() ),它才会将执行的最后一个值发送给观察者。

   constructor() {
      const  bs =  new   AsyncSubject();
    bs.subscribe({
      next: v  => console.log( '  A  '  +  v),
    });
    bs.next(  1  );
    bs.next(  2  );
    bs.next(  3  );
    bs.next(  4  );
    bs.subscribe({
      next: v  => console.log( '  B  '  +  v)
    });
    bs.complete();
    bs.next(  5  );
  } 

  结果:

    

 

查看更多关于angular Observable的详细内容...

  阅读:35次