我在Box(material ui(的onScroll方法中调用了一个操作,但我只需要调用一次saga,但这并没有发生。每次用户滚动div时,即使我使用takeLatest
,也会多次调用saga。我如何才能让这个传奇故事只被称为一次?
function* watchPanelScroll() {
yield takeLatest(PANEL_SCROLL.scroll, handleScrollPanel)
}
export default watchPanelScroll
takeLatest
应该是那样工作的吗?每次用户滚动div时,我都需要运行一个saga,但我希望它只被调用一次。这可能吗?
takeLatest
不应该这样工作。引用文档cancels any previous saga task started previously if it's still running.
。因此,如果之前调用过该传奇并不重要,只要之前的传奇仍在运行即可。我不知道你在handleScrollPanel
中做什么,但如果它只是同步的,并且由于滚动事件是异步的,那么就永远不会有任何东西可以取消。
实际的解决方案将取决于您所说的I need the saga to be called only once
。如果你真的希望这个传奇只被调用一次,那么你可以使用take
效果。
function* watchPanelScroll() {
const action = yield take(PANEL_SCROLL.scroll)
yield call(handleScrollPanel, action)
}
但很可能你想重置";一次";一段时间后的状况。如果你只想限制传奇故事在某个特定时间被调用的频率,那么像节流或反跳之类的东西可能会很有用。
另一方面,如果重置是由某些特定操作(导航、打开某些模态等(引起的,则可以使用另一个redux操作。
function* watchPanelScroll() {
while (true) {
const action = yield take(PANEL_SCROLL.scroll)
yield call(handleScrollPanel, action)
yield take(SCROLL_RESET)
}
}