日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用 Rx 中预定义的 Subject

發布時間:2025/7/25 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 Rx 中预定义的 Subject 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看到一幅有趣的關于 Rx 學習的圖,想知道學習 Rx 的學習曲線?不,是峭壁!

我們可以直接通過 Rx 的 Observer 來創建 Observable 對象。

但是,使用這種方式往往比較復雜,在特定的場景下,我們可以直接使用 Rx 提供的特定 Subject 來實現 Observable。這些特定的 Subject 是主題和訂閱者的混合體,我們可以直接使用這樣的一個對象來實現信息的發布和數據流的訂閱。

1. Subject

通用的 Subject,既可以被訂閱,從名字也可以看到它本身就是一個主題,所以可以直接用來發布信息。如果需要實現一個普通的主題,它就是最理想的選擇。

使用方式:

發布信息的方法:

onNext( value )

發布一個新的值到數據流中。

onCompleted()

數據流終止。

onError( error )

發布異常。

使用示例:

var subject = new Rx.Subject();var subscription = subject.subscribe(function (x) {console.log('Next: ' + x.toString());},function (err) {console.log('Error: ' + err);},function () {console.log('Completed');});subject.next(42);// => Next: 42 subject.next(56);// => Next: 56 subject.completed();// => Completed

?

See Also:?

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/subject.md

2. AsyncSubject

緩存直到 completed() 的最后一個值。所有的訂閱者都會收到同樣的最后一個值。

注意只能有一個值,在 completed() 之后,將不能再發布新的值。而所有的訂閱者也只能得到最后一個值。

使用方式:

必須使用 completed() 完成流,訂閱者將會在 completed() 之后才能得到最后一個值。

使用示例:

var subject = new Rx.AsyncSubject();var i = 0; var handle = setInterval(function () {subject.onNext(i);if (++i > 3) {subject.onCompleted();clearInterval(handle);} }, 500);var subscription = subject.subscribe(function (x) {console.log('Next: ' + x.toString());},function (err) {console.log('Error: ' + err);},function () {console.log('Completed');});// => Next: 3 // => Completed

圖例

See also:?https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/asyncsubject.md

3. BehaviorSubject

如果是希望訂閱者獲得當前的最后一個值,但是后面可能還會提供新的值,可以考慮這個。

緩存已經發布的最后數據,新的訂閱者可以接收到最后一個已經發布的值,和以后發布的新的值。

它可以直接設置一個初始值。如果不需要初始值,可以考慮使用 ReplaySubject.

使用方式:

BehaviorSubject(initialValue)

在構造函數中提供初始的值。

getValue()

獲取當前的值,或者拋出異常,在調用了 completed() 之后,最后的值被保留。在 error() 之后,總是拋出一個特定的異常。

使用示例

/* Initialize with initial value of 42 */ var subject = new Rx.BehaviorSubject(42);var subscription = subject.subscribe(function (x) {console.log('Next: ' + x.toString());},function (err) {console.log('Error: ' + err);},function () {console.log('Completed');});// => Next: 42 subject.next(56); // => Next: 56 subject.completed(); // => Completed

圖例

?

See also:?

https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/behaviorsubject.md

4. ReplaySubject

可以用來緩存流中最后 n 個數據,在新的觀察者登記之后,這些緩存的數據直接發布給新的觀察者。

使用說明:

在構造 ReplaySubject 對象的時候,配置緩存的數據元素數量以及時間窗口。

ReplaySubject([bufferSize], [windowSize], [scheduler])

使用特定的緩存大小,時間窗口和調度器來創建?ReplaySubject?對象實例.

Arguments

  • [bufferSize = Number.MAX_VALUE]?(Number): Maximum element count of the replay buffer.
  • [windowSize = NUMBER.MAX_VALUE]?(Number): Maximum time length of the replay buffer.
  • [scheduler = Rx.Scheduler.currentThread]?(Scheduler): Scheduler the observers are invoked on.
  • 使用示例

    var subject = new Rx.ReplaySubject(2 /* buffer size */);subject.next('a'); subject.next('b'); subject.next('c');var subscription = subject.subscribe(function (x) {console.log('Next: ' + x.toString());},function (err) {console.log('Error: ' + err);},function () {console.log('Completed');});// => Next: b // => Next: c subject.next('d'); // => Next: d

    ?

    圖例

    ?

    See Also:?

    http://reactivex.io/rxjs/manual/overview.html#subject

    ?

    轉載于:https://www.cnblogs.com/haogj/p/6284598.html

    總結

    以上是生活随笔為你收集整理的使用 Rx 中预定义的 Subject的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。