Observable 的创建功能 有很多方法可以在Angular中创建Observable对象。您可以使用Observable构造函数,如Observable教程中所示。还有许多函数可以用来创建新的Observable。这些函数帮助我们从数组、字符串、promise等创建Observable。
create 
defer 
empty 
from 
fromEvent 
interval 
of 
range 
throw 
timer 所有与创建相关的操作符都是RxJs核心库的一部分。您可以从“rxjs”库导入它 
 
Create 调用Create方法是创建Observable最简单的方式。Create是Observable对象的内容方法,所以您不必导入它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ngOnInit ( ) {         const  obsUsingCreate = Observable .create ( observer  =>  {      observer.next ( '1'  )      observer.next ( '2'  )      observer.next ( '3'  )      observer.complete ()    })     obsUsingCreate       .subscribe (val  =>  console .log (val),               error =>  console .log ("error" ),               () =>  console .log ("complete" )) } ****Output  ***** 1 2 3 Complete 
 
Observable 构造函数 我们在上一个示例中可以看到这一点,Observable.create方法和Observable构造函数之间没有区别。Observable的Create方法实际在幕后调用Observable的构造函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ngOnInit ( ) {       const  obsUsingConstructor = new  Observable ( observer  =>  {       observer.next ( '1'  )       observer.next ( '2'  )       observer.next ( '3'  )         observer.complete ()    })      obsUsingConstructor         .subscribe (val  =>  console .log (val),                 error =>  console .log ("error" ),                 () =>  console .log ("complete" )) }     ****Output  ***** 1 2 3 complete 
 
Of 操作符 Of(a,b,c) 1 2 3 4 5 6 7 8 9 10 11 ngOnInit ( ) {  const  array=[1 ,2 ,3 ,4 ,5 ,6 ,7 ]   const  obsof1=of (array);   obsof1.subscribe (val  =>  console .log (val),            error =>  console .log ("error" ),           () =>  console .log ("complete" ))   } **** Output  *** [1 , 2 , 3 , 4 , 5 , 6 , 7 ] complete 
 
From 操作符 from([1,2,3]) From 操作符受一个可以迭代的参数,并将其转换为Observable的参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 ngOnInit ( ) {      const  array3 = [1 , 2 , 3 , 4 , 5 , 6 , 7 ]     const  obsfrom1 = from (array3);     obsfrom1.subscribe (val  =>  console .log (val),       error  =>  console .log ("error" ),       () =>  console .log ("complete" )) } *** Output  **** 1 2 3 4 5 6 7 complete ngOnInit ( ) {   const  obsfrom2 = from ('Hello World' );     obsfrom2.subscribe (val  =>  console .log (val),       error  =>  console .log ("error" ),       () =>  console .log ("complete" )) } *** Output  **** H e l l o   W o r l d complete 
 
Of Vs From 
Of 
From 
 
 
接受变量(并不是参数) 
只接受一个参数 
 
在不更改任何内容的情况下按原样发出每个变量 
迭代参数并发出每个值 
 
fromEvent 操作符 语法 1 2 3 4 fromEvent<T>(target : FromEventTarget <T>,               eventName : string ,               options : EventListenerOptions ,               resultSelector : (...args: any [] ) =>  T): Observable <T> 
 
FromEventsTarget:是fromvevent的第一个参数。它可以是DOM EventTarget、Node.js EventEmitter、类似JQuery的事件目标、NodeList或HTMLCollection。目标必须有一个方法来注册/注销事件处理程序。(如果是DOM事件目标,则为addEventListener/removeEventListener)
eventName:是第二个参数,这是我们想要侦听的事件类型。
eventListenerOptions:是我们在注册事件处理程序(即addEventListener)时要传递给的附加参数
resultSelector:是可选的,在未来的版本中将不推荐使用
示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 `<button #btn>Button</button> ` @ViewChild ('btn' , { static : true  }) button : ElementRef ; buttonClick ( ) {     this .buttonSubscription  =  fromEvent (this .button .nativeElement , 'click' )         .subscribe (res  =>  console .log (res));   } ngAfterViewInit ( ) {    this .buttonClick ();   } 
 
我们可以从ngAfterViewInit方法调用上述方法。请注意,@ViewChild在ngOnInit之前不会初始化btn元素。因此,我们在这里使用ngAfterViewInit。
pipe 操作符 Angular Observable的管道方法用于将多个操作符链接在一起。我们可以将管道作为一个独立的方法使用,这有助于我们在多个地方重用它或将其作为一个实例方法。在本教程中,我们将了解管道,并了解如何在Angular应用程序中使用它。我们将向您展示使用map、filter和tap操作符的管道示例。
使用Pipe 链接操作符 管道方法接受filter、map等运算符作为参数。每个参数必须用逗号分隔。运算符的顺序很重要,因为当用户订阅可观察对象时,管道会按添加运算符的顺序执行运算符。
我们有两种方法可以使用这个管道。一种是作为observable的实例,另一种是作为独立方法使用
pipe作为实例方法 管道作为实例方法如下所示。我们将运算符op1、op2等作为参数传递给管道方法。op1方法的输出变成op2运算符的输入,依此类推。
1 2 3 4 5 6 obs.pipe (   op1 (),   op2 (),   op3 (),   op3 (), ) 
 
以下是将管道与map & filter操作符一起使用的示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 import  { Component , OnInit  } from  '@angular/core' ;import  { Observable , of } from  'rxjs' ;import  { map, filter, tap } from  'rxjs/operators'     @Component ({  selector : 'app-root' ,   templateUrl : './app.component.html' ,   styleUrls : ['./app.component.css' ] }) export  class  AppComponent  implements  OnInit  {    obs = new  Observable ((observer ) =>  {     observer.next (1 )     observer.next (2 )     observer.next (3 )     observer.next (4 )     observer.next (5 )     observer.complete ()   }).pipe (     filter (data  =>  data > 2 ),                         map ((val ) =>  {return  val as  number  * 2 }),       )    data = [];     ngOnInit ( ) {     this .obs1 .subscribe (       val  =>  {         console .log (this .data )       }     )   }   }     [6 , 8 , 10 ] import  { Component , OnInit  } from  '@angular/core' ;import  { Observable , of , pipe } from  'rxjs' ;import  { map, filter, tap } from  'rxjs/operators'     @Component ({  selector : 'app-root' ,   templateUrl : './app.component.html' ,   styleUrls : ['./app.component.css' ] }) export  class  AppComponent  implements  OnInit  {    obs = new  Observable ((observer ) =>  {     observer.next (1 )     observer.next (2 )     observer.next (3 )     observer.next (4 )     observer.next (5 )     observer.complete ()   }).pipe (     tap (data  =>  console .log ('tap ' +data)),                filter (data  =>  data > 2 ),                             tap (data  =>  console .log ('filter ' +data)),             map ((val ) =>  { return  val as  number  * 2  }),           tap (data  =>  console .log ('final ' +data)),            )       data = [];     ngOnInit ( ) {       this .obs .subscribe (       val  =>  {         this .data .push (val)         console .log (this .data )       }     )     } } 
 
Pipe 作为单独方法 我们也可以将管道作为一个独立的函数来组成操作符,并在其他地方重用管道。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 customOperator = pipe (     tap (data  =>  console .log ('tap ' +data)),     filter (data  =>  data > 2 ),     tap (data  =>  console .log ('filter ' +data)),     map ((val ) =>  {       return  val as  number  * 2      }),     tap (data  =>  console .log ('final ' +data)),   );       obs = new  Observable ((observer ) =>  {     observer.next (1 )     observer.next (2 )     observer.next (3 )     observer.next (4 )     observer.next (5 )     observer.complete ()   })      ngOnInit ( ) {     this .customOperator (this .obs ).subscribe (); 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37   customOperator = pipe (     tap (data  =>  console .log ('tap ' +data)),     filter (data  =>  data > 2 ),     tap (data  =>  console .log ('filter ' +data)),     map ((val ) =>  {       return  val as  number  * 2      }),     tap (data  =>  console .log ('final ' +data)),   );       obs = new  Observable ((observer ) =>  {     observer.next (1 )     observer.next (2 )     observer.next (3 )     observer.next (4 )     observer.next (5 )     observer.complete ()   }).pipe (         this .customOperator ,     tap (data  =>  console .log ('final ' +data)),   )       data = [];     ngOnInit ( ) {       this .obs .subscribe (       val  =>  {         this .data .push (val)         console .log (this .data )       }     )     } } 
 
总结 我们可以使用Create方法或Observable构造函数来创建一个新的Observable。 当您有类似数组的值时,Of运算符很有用,您可以将其作为单独的参数传递给Of方法以创建可观察的值。 From操作符试图迭代传递给它的任何东西,并从中创建一个可观察的对象。 RxJS库中有许多其他运算符或方法可用于创建和操作Angular observable。我们将在接下来的几个教程中学习其中的一些内容