需要rxjs专家来解决这个令人毛骨悚然的难题:)

时间:2019-07-08 11:42:04

标签: javascript rxjs

在这里真的需要一些帮助,以解决我面临的这个难题。.我要用甜甜圈的生产来粉刷一下。 (在感到压力时我们吃的那圈东西)

应该如何

在理想情况下,用户应该能够更改甜甜圈的“工厂”和“打顶”设置。

情况是,每次导入甜甜圈时,选定的工厂都会立即制作带有选定浇头的甜甜圈。

制作甜甜圈的时间长短不一。

制作甜甜圈后,它将被存储。

现在,我面临的问题是我无法更改Factory&Topping。 (它始终是默认值N1,使用下面的代码应该可以更好地解释难题。)

  

注意

     

顺序很重要。   如果用户键入abc,则甜甜圈应为["N1a", "N1b", "N1c"],即使甜甜圈中特定类型的甜甜圈的制作时间较长。   如果用户键入a2ijk3x,{{1} },甜甜圈应该为y

这是我在下面编写的代码,希望您的rxjs专家在解决这个问题时感到高兴,因为我已经吃了太多的甜甜圈,试图解决这个问题!

代码: https://stackblitz.com/edit/rxjs-uhqftu

["N1a", "N2i", "N2j", "N2k", "N3x", "N3y"]

2 个答案:

答案 0 :(得分:0)

我参加聚会有点晚,但是解决方案是使用switchMap()中的concatMap()而不是processEvent$。这是代码:

const processEvent$ = settingEvents$.pipe(
  switchMap( ( [ factory, topping ] ) => // change to switchMap and delete redundant merge
    importDonutEvent$.pipe(
      map( type => ( { factory, topping, type } ) ),
    )
  )
);

这是工作中的StackBlitz

答案 1 :(得分:0)

The other answer是正确的。我只想添加它,因为concatMap等待内部可观察对象完成,然后再运行其功能以产生新的内部可观察对象。就您而言,importDonutEvent$永远不会完成,因此settingEvents$发出的值会无限期排队。

您的演示很好,但是您是否考虑过使用marble tests突出问题?测试和记录行为要容易得多。我创建了一个显示问题的stackblitz,其中有两个通过的实现,一个失败。所示的第二种选择是使用运算符withLatestFrom