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

IT技术 javascript reactjs rxjs
2021-05-20 04:18:39

RxJS 有一个漂亮的函数fromCallback,它接受一个最后一个参数是回调的函数并返回一个Observable. 我想将它与 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个回答

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

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

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

问题的答案使用相同的技术被问到这里这里