最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

angular中的observable問(wèn)題

 更新時(shí)間:2022年10月09日 08:55:14   作者:不另外加糖  
這篇文章主要介紹了angular中的observable問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

angular的observable

類似于promise,angular里有observable來(lái)處理異步操作,接下來(lái)簡(jiǎn)要介紹一下他。在使用observable之前,需要在相應(yīng)的組件里先引入

import { Observable } from 'rxjs';

例如,我想先創(chuàng)建一個(gè)發(fā)送異步請(qǐng)求的文件storage.service.ts,把它放在service里,哪里需要哪里引用。

可以發(fā)現(xiàn)observable的使用和promise類似,先new一個(gè)實(shí)例,該實(shí)例接受一個(gè)函數(shù)參數(shù),該函數(shù)參數(shù)內(nèi)部可實(shí)現(xiàn)異步操作,又有一個(gè)observer參數(shù),我們可以通過(guò)observer.next將異步數(shù)據(jù)拋出,這樣我們就能在外部接收到該參數(shù)。

?// observable 使用之前先引入
? getObservable(){
? ? return new Observable((observer)=>{
? ? ? setTimeout(()=>{
? ? ? ? var data = 'observer數(shù)據(jù)'
? ? ? ? observer.next(data) ? ? ? ? ? ? ? ?//相當(dāng)于promise的resolve
? ? ? },2000)
? ? })
? }

現(xiàn)在我們需要在home組件中使用,注意:需要先在home.ts引入storage.service.ts,然后在consructor中定義變量

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

之后便可在home組件中拿到observer.next拋出的數(shù)據(jù)

let oberverData = this.storage.getObservable()
?
let d = oberverData.subscribe((res)=>{ ? ? ? ?//相當(dāng)于promise的then
? ? ? console.log(res)
})

與promise不同的是,observable功能更加強(qiáng)大。

1、取消訂閱   

observable可以在訂閱之后,取消訂閱

setTimeout(()=>{
? ? ? d.unsubscribe() ? ? ? ? ? ?//一秒鐘之后取消訂閱,接收不到消息
},1000)

2、多次輸出     

promise的狀態(tài)一旦從pending變?yōu)閞eject或resolve后,就不會(huì)發(fā)生改變,因此他不能多次輸出resolve出的值,但observable可以實(shí)現(xiàn)多次輸出。例

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對(duì)拋出的數(shù)據(jù)進(jìn)行處理

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數(shù)據(jù)類型的單元測(cè)試數(shù)據(jù)準(zhǔn)備

我有一個(gè)Component,其items屬性是一個(gè)嵌套的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,調(diào)用map的回調(diào)里又嵌入了map操作,這是返回類型為嵌套Observable的原因。

因?yàn)閕tems 是 從componentData是從componentData 是從componentData得來(lái)的,而componentData$又來(lái)自componentData,因此我只用考慮如何構(gòu)造componentData測(cè)試數(shù)據(jù)就行了:

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

下面看看如何在單元測(cè)試用例里創(chuàng)建mock數(shù)據(jù):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),
};

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Angular中使用$watch監(jiān)聽(tīng)object屬性值的變化(詳解)

    Angular中使用$watch監(jiān)聽(tīng)object屬性值的變化(詳解)

    下面小編就為大家?guī)?lái)一篇Angular中使用$watch監(jiān)聽(tīng)object屬性值的變化(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Angularjs整合微信UI(weui)

    Angularjs整合微信UI(weui)

    本文給大家推薦的是使用angularjs實(shí)現(xiàn)整合微信新推出的UI(weui)的全部過(guò)程,有相同需求的小伙伴可以參考下
    2016-03-03
  • 通過(guò)angular CDK實(shí)現(xiàn)頁(yè)面元素拖放的步驟詳解

    通過(guò)angular CDK實(shí)現(xiàn)頁(yè)面元素拖放的步驟詳解

    這篇文章主要給大家介紹了關(guān)于如何通過(guò)angular CDK實(shí)現(xiàn)頁(yè)面元素拖放的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用angular具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • AngularJS入門教程之Scope(作用域)

    AngularJS入門教程之Scope(作用域)

    本文主要介紹AngularJS Scope(作用域),這里對(duì)Score知識(shí)做了詳細(xì)介紹,并提供實(shí)例代碼,有需要的小伙伴可以參考下
    2016-07-07
  • angular8和ngrx8結(jié)合使用的步驟介紹

    angular8和ngrx8結(jié)合使用的步驟介紹

    這篇文章主要給大家介紹了關(guān)于angular8和ngrx8結(jié)合使用的詳細(xì)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用angular8具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • AngularJS過(guò)濾器filter用法總結(jié)

    AngularJS過(guò)濾器filter用法總結(jié)

    這篇文章主要介紹了AngularJS過(guò)濾器filter用法,結(jié)合實(shí)例形式較為詳細(xì)的總結(jié)分析了過(guò)濾器filter的功能、分類、使用技巧及自定義過(guò)濾器的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2016-12-12
  • angular或者js怎么確定選中ul中的哪幾個(gè)li

    angular或者js怎么確定選中ul中的哪幾個(gè)li

    下面小編就為大家?guī)?lái)一篇angular或者js怎么確定選中ul中的哪幾個(gè)li。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 3個(gè)可以改善用戶體驗(yàn)的AngularJS指令介紹

    3個(gè)可以改善用戶體驗(yàn)的AngularJS指令介紹

    這篇文章主要介紹了3個(gè)可以改善用戶體驗(yàn)的AngularJS指令,AngularJS是一款具有很高人氣的JavaScript框架,需要的朋友可以參考下
    2015-06-06
  • AngularJS入門教程之路由與多視圖詳解

    AngularJS入門教程之路由與多視圖詳解

    本文主要介紹AngularJS 路由與多視圖詳解,這里整理了相關(guān)資料及示例代碼,詳細(xì)說(shuō)明了在開(kāi)發(fā)過(guò)程中如何應(yīng)用,有興趣的朋友可以看下
    2016-08-08
  • Angular中的Promise對(duì)象($q介紹)

    Angular中的Promise對(duì)象($q介紹)

    這篇文章主要介紹了Angular中的Promise對(duì)象($q介紹),本文講解了Promise模式、Q Promise的基本用法、AngularJs中的$q.defferd等內(nèi)容,需要的朋友可以參考下
    2015-03-03

最新評(píng)論

彰化县| 顺平县| 资源县| 钦州市| 万山特区| 方城县| 富川| 临安市| 雷州市| 大竹县| 巩义市| 松滋市| 安化县| 茂名市| 汾西县| 甘泉县| 黔西县| 乐安县| 南澳县| 辉县市| 光山县| 浦城县| 华亭县| 咸宁市| 宁海县| 浪卡子县| 吉水县| 五大连池市| 赫章县| 介休市| 柳州市| 沙田区| 南华县| 鱼台县| 长泰县| 玉溪市| 海盐县| 正阳县| 万州区| 梨树县| 得荣县|