• angular的observable


        类似于promise,angular里有observable来处理异步操作,接下来简要介绍一下他。在使用observable之前,需要在相应的组件里先引入

    import { Observable } from 'rxjs';

       例如,我想先创建一个发送异步请求的文件storage.service.ts,把它放在service里,哪里需要哪里引用。可以发现observable的使用和promise类似,先new一个实例,该实例接受一个函数参数,该函数参数内部可实现异步操作,又有一个observer参数,我们可以通过observer.next将异步数据抛出,这样我们就能在外部接收到该参数。

    1. // observable 使用之前先引入
    2. getObservable(){
    3. return new Observable((observer)=>{
    4. setTimeout(()=>{
    5. var data = 'observer数据'
    6. observer.next(data) //相当于promise的resolve
    7. },2000)
    8. })
    9. }

          现在我们需要在home组件中使用,注意:需要先在home.ts引入storage.service.ts,然后在consructor中定义变量

    1. import { StorageService } from 'src/app/services/storage.service';
    2. constructor(public storage:StorageService) { }

           之后便可在home组件中拿到observer.next抛出的数据

    1. let oberverData = this.storage.getObservable()
    2. let d = oberverData.subscribe((res)=>{ //相当于promise的then
    3. console.log(res)
    4. })

    与promise不同的是,observable功能更加强大。

    1、取消订阅

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

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

    2、多次输出

         promise的状态一旦从pending变为reject或resolve后,就不会发生改变,因此他不能多次输出resolve出的值,但observable可以实现多次输出。例

    1. let p = new Promise(resolve=>{
    2. setInterval(()=>{
    3. resolve('promise interval值')
    4. },2000)
    5. })
    6. p.then(res=>console.log(res)) //只输出一次
    7. // observable
    8. let o = new Observable(observer=>{
    9. setInterval(()=>{
    10. observer.next('observable interval值')
    11. },2000)
    12. })
    13. o.subscribe(res=>console.log(res)) //每隔2秒输出一次

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

    1. let o1 = this.storage.getObservable1()
    2. o1.pipe(
    3. filter((data:any)=> {
    4. return data%2 == 0
    5. }),
    6. map(value => {
    7. return value*value
    8. })
    9. ).subscribe(res=>console.log(res))

  • 相关阅读:
    golang从0到1实战系统四十:处理表单的输入
    linux进程大杂烩==Linux应用编程4
    树、二叉树、树的遍历、树的序列化
    GLPI资产管理系统安装Fusioninventory插件发现Windows和Linux主机
    【Linux】Linux+Nginx部署项目(负载均衡&动静分离)
    设计模式的六大设计原则
    一文详解处理器缓存(缓存一致性、读写屏障、指令预取、false sharing)
    debug 内核自动加载模块事件及禁止用户加载内核模块配置
    springboot+清远旅游推荐网站 毕业设计-附源码211551
    Redis的瓶颈在哪里?
  • 原文地址:https://blog.csdn.net/weixin_49343253/article/details/125603037