推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
weishijun14

请教一个 rxjs 问题。。。。。。

  •  
  •   weishijun14 · Feb 14, 2020 · 5074 views
    This topic created in 2453 days ago, the information mentioned may be changed or developed.

    我有一个需求,

    1. 我点击按钮,
    2. 获得数组,长度为 100
    3. 我会使用其中三个
    4. 当我再次点击按钮的时候,我希望不用重新获得,因为还有 97 个未用完。直接 97 - 3 即可。
    5. 直到 100 个全部用完,才再次发送请求获取下一个 100 个数据。

    求教,,, 或者说一下关键的思路,, 我是 rxjs 新手,百思不解了。。

    23 replies  •  2020-02-17 21:22:18 +08:00
    xcstream
    xcstream
    Feb 15, 2020
    1
    思考了一下 好像不需要 rxjs 也很好写
    weishijun14
    weishijun14
    OP
    Feb 15, 2020
    2
    @xcstream 我在学 rxjs 这是我找的一个练习。。
    sivacohan
    sivacohan
    Feb 15, 2020 via iPhone
    3
    我没用过 rxjs,你这个需求就是要实现个 queue。
    每次远程取到的数据先入 queue,然后再从 queue 里面取数据到本地。
    godoway
    godoway
    Feb 15, 2020
    4
    应该是背压?
    在 rxjava 里面叫 Flowable,rxjs 里面好像没见有
    shadeofgod
    shadeofgod
    Feb 15, 2020
    5
    写了个类似的逻辑,数组长度是 3,每次消耗 1 个,消耗完了才重新请求。

    https://codesandbox.io/s/4xk3kkok09?expanddevtools=1&fontsize=14&hidenavigation=1&theme=dark
    shadeofgod
    shadeofgod
    Feb 15, 2020
    6
    但感觉不太对,我也是很少用 rx
    Perry
    Perry
    Feb 15, 2020 via iPhone
    7
    可能需要另外一条线 track 需不需要再请求
    cuzfinal
    cuzfinal
    Feb 15, 2020 via Android
    8
    你为什么不看看文档呢
    meteor957
    meteor957
    Feb 15, 2020
    9
    @cuzfinal 你又知道人家没看过文档?
    wly19960911
    wly19960911
    Feb 15, 2020
    10
    datasource 的队列别拿 rxjs 做,这个是舍近求远的行为。只需要做个 queue 然后调用方法获取到队列前三位就行了。

    直接 fromEvent(window, 'click').pipe(
    switchMap(v => fromPromise(datasource.get(3))),
    ).subscribe(() => {});
    GiantHard
    GiantHard
    Feb 15, 2020❤️1
    11
    Rx 是用来“推”数据的,而你的需求是“拉”数据,这就可以用到 IxJS: https://codesandbox.io/s/rx-ix-t21qn
    momocraft
    momocraft
    Feb 15, 2020
    13
    什么叫"使用" "获得"?
    weishijun14
    weishijun14
    OP
    Feb 15, 2020
    14
    @lijsh 我就是看了这篇,但是我做的东西和他又稍有不同。。。我增加了一些新特性。。
    weishijun14
    weishijun14
    OP
    Feb 15, 2020
    15
    @wly19960911 你的意思是前端只管取就好了。。100 -3 的行为交给后端么。。
    weishijun14
    weishijun14
    OP
    Feb 15, 2020
    16
    @momocraft 使用就是 view 层只需要显示 3 个。 获得就是发请求。
    weishijun14
    weishijun14
    OP
    Feb 15, 2020
    17
    @GiantHard 大佬又引入一个库啊。。。
    @cuzfinal 文档也在看。。但是就是没有头绪。。

    anyway 谢谢🙏楼上各位大佬解答。。
    weishijun14
    weishijun14
    OP
    Feb 15, 2020
    18
    @shadeofgod 我研究下你这个代码。。
    yoyooyooo
    yoyooyooo
    Feb 15, 2020
    19
    只是缓存个数组的话也没必要用 rxjs,强行用的话另外搞个 BehaviorSubject 存起来好了,不是 rxjs 熟练工,简单实现:

    const data$ = new BehaviorSubject([]);

    fromEvent(document, "click")
    .pipe(
    withLatestFrom(data$),
    switchMap(([e, data]) => {
    return data.length < 3
    ? from(defer(() => mockFetch())).pipe(tap(v => data$.next(v)))
    : of(data);
    }),
    tap(data => data$.next(data.slice(0, data.length - 3))),
    tap(data => {
    console.log(data);
    })
    )
    .subscribe();
    mxT52CRuqR6o5
    mxT52CRuqR6o5
    Feb 15, 2020
    20
    根据前面的评论学习了一下,这应该是背压问题,google 了一下有官方指导
    http://reactivex.io/documentation/operators/backpressure.html
    关键应该是在 ControlledObservable 上
    wly19960911
    wly19960911
    Feb 16, 2020
    21
    @weishijun14 datasource 不是指后端,单纯就是一个获取数据的库,至于背压问题我看了下,rxjs 不太好做这种重复,因为 rxjs 一开始就准备好了数据观测,除非有人手动触发了获取数据的操作。

    switchMap 的 observable 也需要有 subject 来推数据进去。所以这个行为比较难以实现,不如写个库专门拿队列数据。由 rxjs 取就行了。如果不是需要重新拉取这个操作,我感觉挺好实现的...
    StrayBugs
    StrayBugs
    Feb 16, 2020
    22
    大家这么快给实现,然而楼主的描述不是很完整。当请求 pending 时如果按下了按键怎么算?忽略还是算多次取?多次请求返回的结果怎么处理?抛弃旧的还是一并连起来?
    shadeofgod
    shadeofgod
    Feb 17, 2020
    23
    @StrayBugs 你说的对,先定义清楚需求是更好的方式,不过对于闲逛论坛的人来说碰到每一个问题都像面试一样面对的话太累了。所以只是随手一写抛个思路
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2291 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 68ms · UTC 15:50 · PVG 23:50 · LAX 07:50 · JFK 10:50
    ♥ Do have faith in what you're doing.