摘要:原文可觀察量是一種能惰性推送的集合,他可以包含多個(gè)值。是一種惰性計(jì)算方式,會(huì)在迭代中同步的返回到無限個(gè)可能的話返回值。使用一種處理方法,最終可能會(huì)或可能不會(huì)返回一個(gè)值。無論是同步方式還是異步方式,都可以擇其一來傳遞返回值。
Observable原文:http://reactivex.io/rxjs/manu...
可觀察量是一種能惰性推送的集合,他可以包含多個(gè)值。下面的表格對(duì)比了推送和拉取2種方式:
單值 | 多值 | |
---|---|---|
拉取 | Function | Iterator |
推送 | Promise | Observable |
舉例來說,下列Observable 在被訂閱之后會(huì)立即推送(同步)值1,2,3,而值4將會(huì)在1秒之后被推送到訂閱者,之后這個(gè)流進(jìn)入完成狀態(tài):
var obserable = Rx.Observable.create(function(observer){ //注意參數(shù)的命名 observer.next(1); observer.next(2); observer.next(3); setTimeout(function(){ observer.next(4); observer.complete(); },1000); });
為了調(diào)用以上的Observable并輸出其中的值,需要訂閱這個(gè)流:
console.log("just before subscribe"); observable.subscribe({ next:x => console.log("got value:",x), error:err => console.log("something wrong occurred: " + err), complete:() => console.log("done") }); console.log("just after subscribe");
執(zhí)行之后會(huì)輸出:
just before subscribe got value 1 got value 2 got value 3 just after subscribe got value 4 donepull vs push 拉取 vs 推送
拉取和推送是數(shù)據(jù)生產(chǎn)者和數(shù)據(jù)使用者之間進(jìn)行數(shù)據(jù)交換的2種形式。
什么是拉???在拉取系統(tǒng)中,數(shù)據(jù)使用者決定何時(shí)從數(shù)據(jù)生產(chǎn)者那里接收數(shù)據(jù)。數(shù)據(jù)生產(chǎn)者自身并不知道數(shù)據(jù)何時(shí)會(huì)被傳遞給使用者。
每一個(gè)js函數(shù)都是一個(gè)拉取系統(tǒng)。函數(shù)是一個(gè)數(shù)據(jù)生產(chǎn)者,通過在別處被調(diào)用,他返回的單一值將會(huì)被投入計(jì)算。
ES2015又引入了新的拉取系統(tǒng),generator和迭代器(function*)。調(diào)用iterator.next()來消費(fèi)從迭代器(數(shù)據(jù)生產(chǎn)者)中拉取到的數(shù)據(jù)。
Producer | Consumer | |
---|---|---|
Pull | 被動(dòng)的:被請(qǐng)求的時(shí)候返回?cái)?shù)據(jù) | 主動(dòng)的:決定數(shù)據(jù)何時(shí)被請(qǐng)求 |
Push | 主動(dòng)的:按照自己的步驟返回?cái)?shù)據(jù) | 被動(dòng)的:接收的數(shù)據(jù)后作出反應(yīng) |
在推送系統(tǒng)中,數(shù)據(jù)生產(chǎn)者決定何時(shí)把數(shù)據(jù)推送給使用者,使用者自己并不知道何時(shí)能夠接收到數(shù)據(jù)。
Promise是當(dāng)今js中最常見的一種推送系統(tǒng)。和函數(shù)不同,Promise(數(shù)據(jù)生產(chǎn)者)精確的控制時(shí)機(jī),將數(shù)據(jù)“推送”給業(yè)已注冊(cè)的回調(diào)函數(shù)(數(shù)據(jù)使用者)。
RxJS引入了Observables,一個(gè)新的JS推送系統(tǒng)。
一個(gè)Observable是一個(gè)包含多個(gè)值的“數(shù)據(jù)生產(chǎn)者”,它會(huì)將數(shù)據(jù)推送給Observer(數(shù)據(jù)使用者)。
A Function is a lazily evaluated computation that synchronously returns a single value on invocation.
A generator is a lazily evaluated computation that synchronously returns zero to (potentially) infinite values on iteration.
A Promise is a computation that may (or may not) eventually return a single value.
An Observable is a lazily evaluated computation that can synchronously or asynchronously return zero to (potentially) infinite values from the time it"s invoked onwards.
Function是一種惰性計(jì)算方式,當(dāng)他被調(diào)用時(shí)會(huì)同步的返回一個(gè)值。
generator是一種惰性計(jì)算方式,會(huì)在迭代中同步的返回0到無限個(gè)(可能的話)返回值。
Promise使用一種處理方法,最終可能會(huì)(或可能不會(huì))返回一個(gè)值。
Observable是一種惰性處理方法,當(dāng)被調(diào)用的時(shí)候,可以同步也可以異步的返回0到無限個(gè)(可能的話)返回值。
理解Observable有別于流行的說法,Observable既不像多個(gè)EventEmitter,也不像一種能返回多個(gè)值的Promise。
在一些場(chǎng)合,比如廣播消息時(shí),Observer看起來很像EventEmitter,在RxJS中,被稱為Subject。而在大多數(shù)情況下,Observable并不像EventEmitter。
Observables 像一群沒有參數(shù)的函數(shù),形成了多個(gè)值的集合。
考慮以下情況:
function foo() { console.log("Hello"); return 42; } var x = foo.call(); // same as foo() console.log(x); var y = foo.call(); // same as foo() console.log(y);
輸出是:
"Hello" 42 "Hello" 42
用Observables重寫上面的行為是:
var foo = Rx.Observable.create(function(observer){ console.log("Hello"); observer.next(42); }); foo.subscribe(function(x){ console.log(x); }); foo.subscribe(function(y){ console.log(y); });
上面2種情況其實(shí)是由于函數(shù)和Observable都是一種惰性的計(jì)算。如果你不調(diào)用函數(shù),那么console.log("Hello")就不會(huì)被執(zhí)行,也不會(huì)有輸出。同樣的,只用當(dāng)“調(diào)用”(通過subscribe訂閱)Observable,才會(huì)有輸出。
此外,調(diào)用和訂閱都是孤立運(yùn)行的。2個(gè)函數(shù)分別被調(diào)用會(huì)產(chǎn)生2個(gè)效果,2個(gè)Observable訂閱者會(huì)產(chǎn)生2個(gè)獨(dú)立的效果。
不像EventEmitter會(huì)派發(fā)它的狀態(tài)并且不論是否有訂閱者都會(huì)執(zhí)行那樣,Observable不會(huì)派發(fā)狀態(tài)而且是惰性的。
訂閱observable,類似于調(diào)用一個(gè)函數(shù)
有些聲音宣稱Observable是異步的,這是不對(duì)的。如果你使用一個(gè)函數(shù)來輸出日志,像這樣:
console.log("before"); console.log(foo.call()); console.log("after");
輸出是:
"before" "Hello" 42 "after"
同樣的行為,使用Observable:
console.log("before"); foo.subscribe(function(x){ console.log("Hello"); return x; }); console.log("after");
輸出是一樣的:
"before" "Hello" 42 "after"
以上證明了訂閱foo之后,效果和函數(shù)一樣,都是同步的。
無論是同步方式還是異步方式,obsverable都可以擇其一來傳遞返回值。
Observable和函數(shù)之間有什么區(qū)別?Observables可以隨著時(shí)間線返回多個(gè)值,函數(shù)卻不能,因此你可以這樣:
function foo() { console.log("Hello"); return 42; return 100; // dead code. will never happen }
函數(shù)返回單一的值,Observables卻可以這樣:
var foo = Rx.Observable.create(function(observer){ console.log("hello"); observer.next(42); observer.next(100); observer.next(200); }); console.log("before"); foo.subscribe(function(x){ console.log(x); }); console.log("after");
同步式的輸出:
"before" "Hello" 42 100 200 "after"
也可以使用異步式的輸出:
var foo = Rx.Observable.create(function(observer){ console.log("Hello"); observer.next(42); observer.next(100); observer.next(200); setTimeout(function(){ observer.next(300); },1000); }); console.log("before"); foo.subscribe(function(x){ console.log(x); }); console.log("after");
輸出為:
"before" "Hello" 42 100 200 "after" 300
結(jié)論:
func.call()意味著“同步的返回一個(gè)值”。
observable.subscribe()意思是“返回任意數(shù)量的值,同步式、異步式二擇其一?!?/p>
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/83629.html
摘要:原文是一個(gè)使用可觀察量隊(duì)列解決異步編程和基于事件編程的庫。提供了幾個(gè)管理異步事件的核心概念可觀察量,代表了一個(gè)由未來獲取到的值或事件組成的集合。相當(dāng)于事件觸發(fā)器,是向多個(gè)廣播事件或推送值的唯一方法。 原文:http://reactivex.io/rxjs/manu... RxJS 是一個(gè)使用可觀察量(observable)隊(duì)列解決異步編程和基于事件編程的js庫。他提供了一個(gè)核心的類型O...
摘要:原文什么是觀察者是流推送數(shù)據(jù)的用戶。觀察者們就是一組函數(shù)的集合,監(jiān)聽著每一個(gè)流推送出的不同類型的通知,包括和。如果沒有為某個(gè)類型的通知提供,流的執(zhí)行過程仍然會(huì)照常進(jìn)行,但是響應(yīng)的通知將會(huì)被忽略,因?yàn)橛^察者沒有提供相應(yīng)的來接收。 原文: http://reactivex.io/rxjs/manu... 什么是Observer? 觀察者(Observer)是Observable流推送數(shù)據(jù)的...
摘要:通過執(zhí)行和可以向訂閱者推送不同的通知。之后,執(zhí)行過程可能被處理掉。當(dāng)調(diào)用并得到觀察者時(shí),在中傳入的函數(shù)將會(huì)被執(zhí)行。每次執(zhí)行都會(huì)觸發(fā)一個(gè)單獨(dú)針對(duì)當(dāng)前的運(yùn)行邏輯。通知不發(fā)出任何值,表示流的結(jié)束。 原文:http://reactivex.io/rxjs/manu... Rx.Observalbe.create()或者創(chuàng)建操作符,可以 創(chuàng)建(created) Observable流。Obser...
摘要:舉例來說,每年都有生日是一道數(shù)據(jù)流,但是一個(gè)人的年齡卻是一個(gè)流。運(yùn)行結(jié)果顯示,第二個(gè)在訂閱之后,獲得了數(shù)據(jù)流中最后毫秒事件內(nèi)產(chǎn)生的和三個(gè)值。 原文:http://reactivex.io/rxjs/manu... Subject是什么? RxJS的Subject是Observable的一個(gè)特殊類型,他可以將流中的值廣播給眾多觀察者(Observer)。一般的Observalbe流是單一...
摘要:原文什么是是一個(gè)對(duì)象,表示一種可被處置的資源,通常指代一個(gè)流的執(zhí)行過程。在之前版本中的,被稱為可被處置的。本質(zhì)是一個(gè)含有方法,用來釋放資源或者取消流執(zhí)行的對(duì)象。 原文: http://reactivex.io/rxjs/manu... 什么是Subscription? Subscription是一個(gè)對(duì)象,表示一種可被處置的資源,通常指代一個(gè)Observable流的執(zhí)行過程。 Subsc...
閱讀 1888·2021-11-19 09:40
閱讀 2610·2021-08-30 09:46
閱讀 2190·2021-08-03 14:01
閱讀 2659·2019-08-30 10:54
閱讀 1213·2019-08-29 16:38
閱讀 1455·2019-08-29 11:02
閱讀 2546·2019-08-28 18:16
閱讀 1697·2019-08-28 18:09