[英]second merged branch ignored in XStreams
該應用程序使用xstream作為反應庫。
我陷入了一種奇怪的行為。
我的流就是這個圖
在第一個會話var更新中,我得到了以下調試結果:
問題 :未執行“調試2”分支
如果我更新會話項(以便產生新的存儲事件),則兩個分支均按預期執行
如果在“ debug 0”處添加.remember(),也會發生相同的良好行為。
沒有過濾器(並且不記得),流程從第一個事件開始就給出此結果
我的懷疑是在連接第二個分支之前在“調試0”處觀察到某種情況,因此第一個事件已被使用。 但是,如果兩個分支xs.merged在一起怎么辦? 如何執行一個分支而不執行第二個分支? 這兩個分支沒有過濾器或其他處理,它們合並映射到化簡函數。 關於如何調試和解決這種情況的任何建議?
這個問題是因為storage.session.getItem
只要它的認購發出,並merge(a$, b$)
訂閱a$
它贊同前b$
,所以a$
獲取事件,而是由時間b$
是訂閱,已經來不及了。 這個問題是眾所周知的,並稱為毛刺 (在反應式編程中),通常在存在菱形流圖時會發生,這正是您的情況。
我有兩篇有關故障的博客文章,它們可以為您提供更多的背景信息: RxJS調度程序上的入門和Rx故障實際上不是問題 。 它提到了RxJS,但是xstream在實現方面與RxJS非常接近。 xstream和RxJS之間的區別在於,xstream流始終是多播(“共享”)的,並且RxJS具有許多調度程序類型,但是xstream只有一種。 RxJS中的默認調度程序與xstream具有相同的行為。
解決方案是在到達菱形之前應用.remember()
。 這是因為所發出的值需要為該流的其他使用者緩存。 .remember()
只是將流轉換為MemoryStream。 我認為源流最初是一個MemoryStream,而映射一個MemoryStream會創建其他MemoryStreams,但是filter
是一個破壞了它的運算符。 filter
總是返回一個Stream,其原因是MemoryStreams應該總是具有當前值,但是filter
可以刪除值,因此過濾后的流可能沒有任何當前值。
作為Cycle.js的作者,我認為cyclejs / storage的設計方法不是最好的,我認為我們將找到設計這些API的方法,以最大程度地減少與MemoryStream和Stream的混淆。 但是暫時,重要的是要了解這兩者之間的區別並計划應用程序,從而避免出現菱形(和毛刺),或在正確的位置使用.remember()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.