【发布时间】:2019-12-29 01:29:47
【问题描述】:
我正在尝试实现一个必须使用 inner observables 的数据流,其中我使用来自mergeMap、concatMap 等的一个。
例如:
const output$$ = input$$.pipe(
mergeMap(str => of(str).pipe(delay(10))),
share()
);
output$$.subscribe(console.log);
登录控制台时可以正常工作。
但是当我尝试在 React 中使用它时,如下所示,利用 useEffect 和 useState 挂钩来更新一些文本:
function App() {
const input$ = new Subject<string>();
const input$$ = input$.pipe(share());
const output$$ = input$$.pipe(
mergeMap(str => of(str).pipe(delay(10))),
share()
);
output$$.subscribe(console.log);
// This works
const [input, setInput] = useState("");
const [output, setOutput] = useState("");
useEffect(() => {
const subscription = input$$.subscribe(setInput);
return () => {
subscription.unsubscribe();
};
}, [input$$]);
useEffect(() => {
const subscription = output$$.subscribe(setOutput);
// This doesn't
return () => {
subscription.unsubscribe();
};
}, [output$$]);
return (
<div className="App">
<input
onChange={event => input$.next(event.target.value)}
value={input}
/>
<p>{output}</p>
</div>
);
}
它开始表现得很奇怪/不可预测(例如:有时文本会在输入过程中更新,有时它根本不会更新)。
我注意到的事情:
- 如果内部 observable 立即完成/是一个承诺 立即解决,它工作正常。
- 如果我们打印到控制台而不是
useEffect,它工作正常。
我认为这与useEffect 的内部工作原理以及它如何捕获和注意外部变化有关,但无法使其正常工作。
任何帮助深表感谢。
最小复制案例:
https://codesandbox.io/s/hooks-and-observables-1-7ygd8
【问题讨论】:
-
input$$和output$$在每次渲染中创建。此外,useEffect取决于它们,这意味着效果将在每次渲染时执行。
标签: javascript reactjs rxjs react-hooks rxjs6