类似于promise,angular里有observable来处理异步操作,接下来简要介绍一下他。在使用observable之前,需要在相应的组件里先引入
import { Observable } from 'rxjs';
例如,我想先创建一个发送异步请求的文件storage.service.ts,把它放在service里,哪里需要哪里引用。可以发现observable的使用和promise类似,先new一个实例,该实例接受一个函数参数,该函数参数内部可实现异步操作,又有一个observer参数,我们可以通过observer.next将异步数据抛出,这样我们就能在外部接收到该参数。
- // observable 使用之前先引入
- getObservable(){
- return new Observable((observer)=>{
- setTimeout(()=>{
- var data = 'observer数据'
- observer.next(data) //相当于promise的resolve
- },2000)
- })
- }
现在我们需要在home组件中使用,注意:需要先在home.ts引入storage.service.ts,然后在consructor中定义变量
- import { StorageService } from 'src/app/services/storage.service';
-
- constructor(public storage:StorageService) { }
之后便可在home组件中拿到observer.next抛出的数据
- let oberverData = this.storage.getObservable()
-
- let d = oberverData.subscribe((res)=>{ //相当于promise的then
- console.log(res)
- })
与promise不同的是,observable功能更加强大。
observable可以在订阅之后,取消订阅
- setTimeout(()=>{
- d.unsubscribe() //一秒钟之后取消订阅,接收不到消息
- },1000)
promise的状态一旦从pending变为reject或resolve后,就不会发生改变,因此他不能多次输出resolve出的值,但observable可以实现多次输出。例
- let p = new Promise(resolve=>{
- setInterval(()=>{
- resolve('promise interval值')
- },2000)
- })
- p.then(res=>console.log(res)) //只输出一次
-
- // observable
- let o = new Observable(observer=>{
- setInterval(()=>{
- observer.next('observable interval值')
- },2000)
- })
- o.subscribe(res=>console.log(res)) //每隔2秒输出一次
- let o1 = this.storage.getObservable1()
- o1.pipe(
- filter((data:any)=> {
- return data%2 == 0
- }),
- map(value => {
- return value*value
- })
- ).subscribe(res=>console.log(res))