angular的observable

  • Post author:
  • Post category:其他


类似于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功能更加强大。

1、取消订阅

observable可以在订阅之后,取消订阅

setTimeout(()=>{
      d.unsubscribe()            //一秒钟之后取消订阅,接收不到消息
},1000)

2、多次输出

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秒输出一次

3、使用pipe对抛出的数据进行处理

let o1 = this.storage.getObservable1()
o1.pipe(
   filter((data:any)=> {
      return data%2 == 0
   }),
   map(value => {
      return value*value
   })
).subscribe(res=>console.log(res))



版权声明:本文为weixin_49343253原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。