簡體   English   中英

XStreams中忽略的第二個合並分支

[英]second merged branch ignored in XStreams

我正在使用存儲狀態插件開發Cycle JS應用。

該應用程序使用xstream作為反應庫。

我陷入了一種奇怪的行為。

我的流就是這個圖

在此處輸入圖片說明

在第一個會話var更新中,我得到了以下調試結果:

  • 調試0
  • 調試1
  • 調試3

問題 :未執行“調試2”分支

如果我更新會話項(以便產生新的存儲事件),則兩個分支均按預期執行

  • 調試0
  • 調試1
  • 調試2
  • 調試3

如果在“ debug 0”處添加.remember(),也會發生相同的良好行為。 在此處輸入圖片說明

  • 調試0
  • 調試1
  • 調試2
  • 調試3

更陌生的是,如果我移除過濾器,流程將按預期工作 在此處輸入圖片說明

沒有過濾器(並且不記得),流程從第一個事件開始就給出此結果

  • 調試0
  • 調試1
  • 調試2
  • 調試3

我的懷疑是在連接第二個分支之前在“調試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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM