广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >angular中的observable问题
  • 558
分享到

angular中的observable问题

2024-04-02 19:04:59 558人浏览 八月长安
摘要

目录angular的observable1、取消订阅   2、多次输出     3、使用pipe对抛出的数据进行处理angular

angular的observable

类似于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))

angular observable数据类型的单元测试数据准备

我有一个Component,其items属性是一个嵌套的Observable:

 items$: Observable<Observable<Product>[]> = this.componentData$.pipe(
    map((data) => data.productCodes.trim().split(' ')),
    map((codes) =>
      codes.map((code) => this.productService.get(code, this.PRODUCT_SCOPE))
    )
  );

ComponentData$的类型:

  private componentData$: Observable<model> = this.componentData.data$.pipe(
    filter(Boolean)
  );

Model的定义:

componentData$类型为Observable,调用map的回调里又嵌入了map操作,这是返回类型为嵌套Observable的原因。

因为items 是 从componentData是从componentData 是从componentData得来的,而componentData$又来自componentData,因此我只用考虑如何构造componentData测试数据就行了:

  private componentData$: Observable<model> = this.componentData.data$.pipe(
    filter(Boolean)
  );

下面看看如何在单元测试用例里创建mock数据:MockCmsProductCarouselComponent:

完整解决方案

const mockComponentData: CmsProductCarouselComponent = {
  uid: '001',
  typeCode: 'ProductCarouselComponent',
  modifiedTime: new Date('2017-12-21T18:15:15+0000'),
  popup: 'false',
  productCodes: productCodeArray.join(' '),
  scroll: 'ALLVISIBLE',
  title: 'Mock Title',
  name: 'Mock Product Carousel',
  container: 'false',
};
const MockCmsProductCarouselComponent = <CmsComponentData<any>>{
  data$: of(mockComponentData),
};

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: angular中的observable问题

本文链接: https://www.lsjlt.com/news/168965.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • angular中的observable问题
    目录angular的observable1、取消订阅   2、多次输出     3、使用pipe对抛出的数据进行处理angular ...
    99+
    2022-11-13
  • Observable怎么在Angular中使用
    这期内容当中小编将会给大家带来有关Observable怎么在Angular中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。可观察对象(Observable)可观察对象支持在应用的发布者和订阅者之间传递...
    99+
    2023-06-14
  • angular中radio单选的问题解决demo
    html中单选框用法 html中单选框用法如下,checked用来选中默认的单选项: <input type="radio" name="sex" value="male" c...
    99+
    2023-05-20
    angular radio单选 angular radio
  • angular常见问题有哪些
    这篇文章主要介绍了angular常见问题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。AngularJS可以视为是一种数据优先的框架,...
    99+
    2022-10-19
  • 浅谈Angular的12个经典问题
    目录1. 请解释Angular 2应用程序的生命周期hooks是什么?2. 使用Angular 2,和使用Angular 1相比,有什么优势?3. Angular 2中的路由工作原理...
    99+
    2022-11-12
  • Angular中使用MathJax遇到的问题有哪些
    这篇文章主要介绍了Angular中使用MathJax遇到的问题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MathJax简介Math...
    99+
    2022-10-19
  • angular中怎么解决ngRoute路径出现#!#的问题
    这篇文章主要介绍了angular中怎么解决ngRoute路径出现#!#的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在做一个开源项目的时候,使用了"angul...
    99+
    2023-06-15
  • Angular 4.X开发实践中会遇到哪些问题
    这篇文章给大家分享的是有关Angular 4.X开发实践中会遇到哪些问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、使用ngIf或者ngSwitch出错在html文件中使用...
    99+
    2022-10-19
  • 如何解决ionic和angular上拉加载的问题
    这篇文章主要介绍了如何解决ionic和angular上拉加载的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。说到ionic上拉加载就跟p...
    99+
    2022-10-19
  • angular使用TweenMax动画库的问题和解决方法
    最近闲来无事,捣鼓捣鼓CSS 发现了一个比较好动画库,就是TweenMax 用起来略微有点麻烦,但是效果确实可以。 首先在angular中使用TweenMax就得先通过npm 安装 ...
    99+
    2022-11-11
  • Angular 服务器端渲染缓存功能问题
    关于通过 Angular Universal 渲染出的页面源代码,我们有两种缓存方式: HTTP cache 使用网络缓存时,一切都是为了在服务器上设置正确的响应标头。 它们指定缓存...
    99+
    2022-11-13
  • 如何解决Angular客户端请求Rest服务跨域的问题
    这篇文章主要介绍了如何解决Angular客户端请求Rest服务跨域的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.问题描述:通过Or...
    99+
    2022-10-19
  • Angular开发问题记录:组件拿不到@Input输入属性
    最近在工作中实现一个feature的时候,碰到一个小问题:Angular组件拿不到@Input输入属性的问题,尽管对这些问题都比较了解,但是找问题是需要一个过程的,所以还是把这个问题总结记录了下。【相关教程推荐:《angular教程》】我需...
    99+
    2023-05-14
    Angular.js
  • 详解Angular组件数据不能实时更新到视图上的问题
    目录问题起源OnPush策略当前组件或子组件之一触发了事件总结问题起源 MainComponent: @Component({ selector: 'main', ...
    99+
    2022-11-13
    Angular组件数据实时更新视图 Angular 更新视图
  • Angular 服务器端渲染应用常见的内存泄漏问题小结
    目录屏幕闪烁问题无法通过 API 的方式终止渲染考虑如下的 Angular 代码: import { Injectable, NgZone } from "@angular/core...
    99+
    2022-11-13
  • Angular中关于单元测试的面试题有哪些
    这篇文章主要介绍了Angular中关于单元测试的面试题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Angular中的测试有哪些种,基于哪些测试框架Angular的测试...
    99+
    2023-06-15
  • Angular中@ViewChild的用法
    本篇内容主要讲解“Angular中@ViewChild的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Angular中@ViewChild的用法”吧!简单来...
    99+
    2022-10-19
  • 关于angular的前端面试题有哪些
    这篇文章主要介绍了关于angular的前端面试题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1,ng-if 跟 ng-show/hide 的区别有哪些?第一点区别是,...
    99+
    2023-06-14
  • WritePrivateProfileString中的问题
    WritePrivateProfileString是一个函数,用于向INI文件中写入一个新值或修改一个已有的值。使用WritePri...
    99+
    2023-09-27
    问题
  • Angular组件拿不到@Input输入属性问题探究解决方法
    目录区别一区别二区别三总结我需要给一个Component设置一个输入属性 @Input,好了,直接上代码,没有什么难度。 原代码是这样的: @Component({ sele...
    99+
    2023-01-31
    Angular组件拿不到@Input输入属性 Angular @Input输入属性
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作