成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[譯] RxJS文檔02—— Observable 可觀察量

A Loity / 1932人閱讀

摘要:原文可觀察量是一種能惰性推送的集合,他可以包含多個(gè)值。是一種惰性計(jì)算方式,會(huì)在迭代中同步的返回到無限個(gè)可能的話返回值。使用一種處理方法,最終可能會(huì)或可能不會(huì)返回一個(gè)值。無論是同步方式還是異步方式,都可以擇其一來傳遞返回值。

原文:http://reactivex.io/rxjs/manu...

Observable

可觀察量是一種能惰性推送的集合,他可以包含多個(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
done
pull 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

相關(guān)文章

  • []RxJS文檔01——介紹

    摘要:原文是一個(gè)使用可觀察量隊(duì)列解決異步編程和基于事件編程的庫。提供了幾個(gè)管理異步事件的核心概念可觀察量,代表了一個(gè)由未來獲取到的值或事件組成的集合。相當(dāng)于事件觸發(fā)器,是向多個(gè)廣播事件或推送值的唯一方法。 原文:http://reactivex.io/rxjs/manu... RxJS 是一個(gè)使用可觀察量(observable)隊(duì)列解決異步編程和基于事件編程的js庫。他提供了一個(gè)核心的類型O...

    BlackHole1 評(píng)論0 收藏0
  • []RxJS文檔04——Observer 觀察

    摘要:原文什么是觀察者是流推送數(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ù)的...

    xiaolinbang 評(píng)論0 收藏0
  • []RxJS文檔03——剖析Observable

    摘要:通過執(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...

    netScorpion 評(píng)論0 收藏0
  • []RxJS06——Subject

    摘要:舉例來說,每年都有生日是一道數(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流是單一...

    gitmilk 評(píng)論0 收藏0
  • [] RxJS文檔05——Subscription

    摘要:原文什么是是一個(gè)對(duì)象,表示一種可被處置的資源,通常指代一個(gè)流的執(zhí)行過程。在之前版本中的,被稱為可被處置的。本質(zhì)是一個(gè)含有方法,用來釋放資源或者取消流執(zhí)行的對(duì)象。 原文: http://reactivex.io/rxjs/manu... 什么是Subscription? Subscription是一個(gè)對(duì)象,表示一種可被處置的資源,通常指代一個(gè)Observable流的執(zhí)行過程。 Subsc...

    walterrwu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<