溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么在angular中使用Observable實(shí)現(xiàn)一個(gè)異步調(diào)用功能

發(fā)布時(shí)間:2021-03-10 15:32:40 來源:億速云 閱讀:496 作者:Leah 欄目:web開發(fā)

本篇文章給大家分享的是有關(guān)怎么在angular中使用Observable實(shí)現(xiàn)一個(gè)異步調(diào)用功能,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Observable(可觀察對象)

Observable(可觀察對象)是基于推送(Push)運(yùn)行時(shí)執(zhí)行(lazy)的多值集合。

拉取(Pull)和推送(Push)

拉取和推送是數(shù)據(jù)生產(chǎn)者和數(shù)據(jù)消費(fèi)者之間通信的兩種不同機(jī)制。

  • 拉?。涸诶∠到y(tǒng)中,總是由消費(fèi)者決定何時(shí)從生產(chǎn)者那里獲得數(shù)據(jù)。生產(chǎn)者對數(shù)據(jù)傳遞給消費(fèi)者的時(shí)間毫無感知(被動的生產(chǎn)者,主動的消費(fèi)者)

  • 推送:在推送系統(tǒng)中生產(chǎn)者決定何時(shí)向消費(fèi)者傳遞數(shù)據(jù),消費(fèi)者對何時(shí)收到數(shù)據(jù)毫無感知(被動的消費(fèi)者)

js中的Promise和Observable

  • 現(xiàn)代JavaScript中Promise是典型的推送系統(tǒng)。作為數(shù)據(jù)生產(chǎn)者的Promise通過resolve()向數(shù)據(jù)消費(fèi)者——回調(diào)函數(shù)傳遞數(shù)據(jù):與函數(shù)不同,Promise決定向回調(diào)函數(shù)推送值的時(shí)間

  • RxJS在JavaScript中引入了Observable(可觀察對象)這個(gè)新的推送系統(tǒng)。Observable是多數(shù)據(jù)值的生產(chǎn)者,向Observer(被動的消費(fèi)者)推送數(shù)據(jù)

Observable與函數(shù)、promsise

  • 函數(shù)是當(dāng)調(diào)用才同步計(jì)算,并最終只返回一個(gè)值的

  • promise是會或者不會返回一個(gè)值

  • Observable是當(dāng)調(diào)用才同步或者異步地計(jì)算,并可能產(chǎn)生0到無窮多個(gè)值的

Observable是函數(shù)概念的拓展

  • Observable就像一個(gè)沒有參數(shù)的函數(shù),并不斷生成一些值供我們使用,因此它也像是一個(gè)事件發(fā)射機(jī)(EventEmitters)

  • 在Observable中subscribe就像call一個(gè)函數(shù),你訂閱它,它才會被'啟動'。同一個(gè)Observable對于不同的subscribe,是不會共享結(jié)果的(通常情況下這樣子的,但可以通過調(diào)用api來共享)

Observable四大核心

創(chuàng)建

  • Rx.Observable.create是Observable構(gòu)造函數(shù)的別名,接受一個(gè)參數(shù):subscribe函數(shù)

  • 除了使用create創(chuàng)建Observable,我們通常還使用創(chuàng)建操作符, 如of,from,interval,等來創(chuàng)建Observable

訂閱

  • observable.subscribe和Observable.create(function subscribe(observer) {…})中的subscribe不是同一個(gè)對象,但在工程中可以在概念上視兩者為等價(jià)物

  • 調(diào)用subscribe的觀察者并不會共享同一個(gè)Observable

  • 訂閱機(jī)制與處理事件的addEventListener/removeEventListenerAPI完全不同。通過observable.subscribe,觀察者并不需要在Observable中進(jìn)行注冊,Observable也不需要維護(hù)訂閱者的列表

  • 訂閱后便進(jìn)入了Observable的執(zhí)行階段,在執(zhí)行階段值和事件將會被傳遞給觀察者供其消費(fèi)

執(zhí)行

  • 只有在被訂閱之后Observable才會執(zhí)行,執(zhí)行的邏輯在Observable.create(function subscribe(observer){…})中描述,執(zhí)行后將會在特定時(shí)間段內(nèi),同步或者異步地成產(chǎn)多個(gè)數(shù)據(jù)值

  • Observable在執(zhí)行過程中,可以推送三種類型的值:

    • “Next” 通知: 實(shí)際產(chǎn)生的數(shù)據(jù),包括數(shù)字、字符串、對象等

    • “Error” 通知:一個(gè)JavaScript錯(cuò)誤或者異常

    • “Complete” 通知:一個(gè)不帶有值的事件

  • 在Observable的執(zhí)行過程中,0個(gè)或者多個(gè)“Next”通知會被推送

  • 在錯(cuò)誤或者完成通知被推送后,Observable不會再推送任何其他通知

終止

  • Observable的執(zhí)行可能是無限的,作為觀察者需要主動中斷執(zhí)行:我們需要特定的API去終止執(zhí)行過程

  • 因?yàn)樘囟ǖ挠^察者都有特定的執(zhí)行過程,一旦觀察者獲得想要的數(shù)據(jù)后就需要終止執(zhí)行過程以免帶來計(jì)算時(shí)對內(nèi)存資源的浪費(fèi)

  • 在observable.subscribe被調(diào)用時(shí),觀察者會與其執(zhí)行作用域綁定,同時(shí)返回一個(gè)Subscription類型的對象,通過調(diào)用subscription.unsubscribe()你可以終止執(zhí)行過程

angular 有個(gè)類叫Observable。 從名字可以看出它提供一個(gè)觀察者模式的類似功能。

也就是說,當(dāng)我們把一個(gè)函數(shù)的返回值用Observable類包裝后, 調(diào)用函數(shù)的使用方就可以訂閱該函數(shù),然后在得到通知后處理后續(xù)的事情, 也就是異步的調(diào)用過程而不是同步等待。

import { Observable } from 'rxjs/rx';
import { of } from 'rxjs/observable/of';

getHeroes(): Observable<Hero[]> {
this.messageService.add('HeroService: fetched heroes');

return of(HEROES);
}

上面的函數(shù)用Observable封裝, of強(qiáng)轉(zhuǎn)后就是一個(gè)異步的函數(shù), 這樣外部在函數(shù)完成后調(diào)用后續(xù)的處理,比如refresh
this.heroService.getHeroes().subscribe(heroes => this.refreshTree(heroes));

以上就是怎么在angular中使用Observable實(shí)現(xiàn)一個(gè)異步調(diào)用功能,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI