当前位置: 首页 > 知识库问答 >
问题:

RxJS和React的setState-延迟函数执行直到订阅

东方栋
2023-03-14

RxJS有一个漂亮的函数,from mCallback,它接受一个函数,该函数的最后一个参数是回调,并返回一个可观察的。我想把它和React的setState函数结合起来,这样我就可以做一些类似的事情:

const setState = Rx.Observable.fromCallback(this.setState);
setState({ myState: 'Hi there!' }).concat(....)

因此,任何链接到setState的操作都保证在设置状态之后发生,最重要的是,只有在有活动订阅服务器时才会调用setState

我注意到的是,即使没有订阅,setState也被正确地调用,因为它被定义并设置了我的组件的状态。所以如果我有:

networkSignal.flatMap((x) => {
    return setState({ myState: 'test' });
});

函数setState立即被调用,但是它产生的观察者在有订阅者之前不会发送下一个。我想要的是函数只在有订阅者时调用。

查看源代码,您可以看到RxJS返回一个函数,该函数在执行时创建一个可观察的但立即调用该函数——回调参数。

共有1个答案

雷曜灿
2023-03-14

fromCallback返回一个函数,该函数在执行时返回一个可观察值。可观察到的是函数调用的异步结果将流动的地方。

要延迟函数的执行,可以使用。延迟。例如:

const setState = Rx.Observable.fromCallback(this.setState);
const deferred$ = Rx.Observable.defer(function (){return setState({ myState: 'Hi there!' }).concat(....)});
// Later on
deferred$.subscribe(...)

在这里和这里被问到的问题,其答案使用了相同的技巧

 类似资料:
  • 延迟异步函数的执行。 延迟执行 async 函数的一部分,通过把它放到 sleep 状态,返回一个 Promise 。 const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); async function sleepyWork() { console.log("I'm going to sleep for 1

  • 最初,我在运行拓扑时只分配了1个executor给QueryNormalizer。执行潜伏期为8.952,处理潜伏期为12.857。 为了更快,我将QueryNormalizer中的执行程序数更改为4。执行延迟更改为197.616,处理延迟更改为59.132。 根据执行延迟的定义-元组在执行方法中花费的平均时间。execute方法可以在不发送元组的Ack的情况下完成。 此外,处理延迟是否应始终低于

  • 我试图理解延迟和延迟订阅操作符之间的区别。 本文件描述了延迟操作员: 延迟操作符通过在发出每个源可观察项之前暂停特定的时间增量(您指定)来修改其源可观察项。这会将可观测项发出的整个项目序列在时间上向前移动指定的增量 delaySubscription是这样描述的: 还有一个操作符,您可以使用它延迟对源可观察对象的订阅:delaySubscription。 然而,当我测试这两个操作员的行为时,我觉得

  • 我两天前才开始学习react,但我对react的方法感到很困难,我只知道使用参数(如果想根据以前的状态更改状态),并且在状态更改后立即执行回调参数(如果这个错误,请纠正我),所以我只是更改数组内容(我使用JavaScript的)并且我希望它在状态更改后立即呈现,它正在更改但延迟了,它只在我再单击一次后呈现,但render方法会被调用以获得任何senpai。谢谢帮助。 句柄点击更改以根据我的按钮“o

  • 问题内容: 有一种方法可以配置javascript方法以立即执行该方法,然后使用计时器执行 问题答案: 第一次直接直接调用函数是最简单的: 但是,有充分的理由要避免-尤其是在某些情况下,整个事件负荷可以彼此紧接着立即到达而没有任何延迟。另一个原因是,如果要停止循环,则必须显式调用,这意味着必须记住原始调用返回的句柄。 因此,另一种方法是使用以下方法触发自己的后续调用: 这样可以确保两次调用之间 至

  • 在Vert.x 中执行定期和延迟的操作是非常常见的。 在标准 verticles 中,不能使用thread sleep 引入延迟,这样会止事件循环线程。 相反,您可以使用 Vert.x 计时器。定时器可以一次性的计时器或定期的计时器。我们将讨论两个 一次性的计时器 一个单次定时器有一定的延迟之后调用一个事件处理程序,以毫秒为单位表示。 使用setTimeout方法启动计时器, long timer