- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是这里描述的“registerEpic”实用程序:Is it an efficient practice to add new epics lazily inside react-router onEnter hooks?
我们的代码需要是等量的,但是在服务器端,第一次触发一个 Action ,一切都很好。但是第二次触发该 Action 时,史诗似乎获得了该 Action 的 2 个副本。这是我的代码:
export const fetchEpic = (action$, store) =>
action$.ofType("FETCH")
.do((action) => console.log('doing fetch', action.payload))
.mergeMap(({meta:{type}, payload:[url, options = {}]}) => {
let defaultHeaders = {
'Accept': 'application/json',
'Content-Type': 'application/json'
};
options.headers = {...defaultHeaders, ...options.headers};
let request = {
url,
method: 'GET',
responseType: 'json',
...options
};
//AjaxObservables are cancellable... that's why we use them instead of fetch. Promises can't be cancelled.
return AjaxObservable.create(request)
.takeUntil(action$.ofType(`${type}_CANCEL`))
.map(({response: payload}) => ({type, payload}))
.catch(({xhr:{response: payload}}) => (Observable.of({type, payload, error: true})));
}
);
registerEpic(fetchEpic);
let epicRegistry = [];
let mw = null;
let epic$ = null;
export const registerEpic = (epic) => {
// don't add an epic that is already registered/running
if (epicRegistry.indexOf(epic) === -1) {
epicRegistry.push(epic);
if (epic$ !== null) { //this prevents the observable from being used before the store is created.
epic$.next(epic);
}
}
};
export const unregisterEpic =(epic) => {
const index = epicRegistry.indexOf(epic);
if(index >= 0) {
epicRegistry.splice(index, 1);
}
}
export const clear = () => {
epic$.complete();
epic$ = new BehaviorSubject(combineEpics(...epicRegistry));
}
export default () => {
if (mw === null) {
epic$ = new BehaviorSubject(combineEpics(...epicRegistry));
const rootEpic = (action$, store) =>
epic$.mergeMap(epic => epic(action$, store));
mw = createEpicMiddleware(rootEpic);
}
return mw;
};
最佳答案
我没有看到 epicMiddleware.replaceEpic
任何地方?如果你不替换中间件中当前运行的史诗,真的很难保证它没有采取行动——这听起来和这里发生的完全一样。
使用 redux-observable(或任何异步中间件,包括 redux-saga)进行服务器端渲染非常困难,因为您必须创建一些约定。例如当您的应用程序启动时,如果史诗开始产生一些副作用,您什么时候说“这就够了”并过早地将其切断?你让他们做任何异步的事情吗?您如何正确保证史诗 真的结束它的所有副作用?中间件可能会停止订阅史诗,但它没有正确链接其订阅者,因此无论如何都会继续产生一些副作用。
这就是为什么我们还没有记录如何在 redux-observable 中执行 SSR,因为虽然我们已经创建了“执行”的代码,但我们对选择没有信心。
无论您决定如何处理它,您很可能最终想调用 epicMiddleware.replaceEpic(nextRootEpic)
让中间件停止订阅之前的根史诗。
如果您不想让史诗在页面呈现服务器端期间执行任何异步操作,您将同步渲染页面,然后在再次用相同的根史诗替换根史诗之后立即呈现。也就是说,你几乎肯定会再次传递完全相同的根史诗,这将有效地“重新启动”你的史诗树——但同样,如果你写了一个行为不端的史诗,也不能保证。
如果您想发布实际的 SSR 代码,我很乐意帮助您进一步详细说明,例如如果你使用 React 和 react-router,这将是你的全部 match({ routes, location: req.url } ...etc)
东西。
值得注意的是,很多人的看法是SSR should not do any side effects ,并将它们留给客户。所以没有 AJAX 调用,在像 React 这样的 redux-observable 情况下,这意味着在 componentDidMount
之前不要调度会导致副作用的操作(不是在服务器端运行)。这主要是因为在许多方面这会破坏 SSR 可能带来的性能优势,因为您没有尽快发送初始 HTML,而是让 JS 出现。但是,通常没有提到的是,如果您不提取任何类型的动态数据,您的应用显然不会有那么多的 SEO 好处。这是您必须决定的权衡,或者可能同时使用两者。
关于在第一次分派(dispatch)后 redux-observable 多个 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40431343/
我的密码 https://gist.github.com/ButuzGOL/707d1605f63eef55e4af 因此,当我收到登录成功回调时,我想进行重定向, 重定向也可以通过调度程序进行。 我
我已经写了访问者模式如下,但我不明白什么是单次和双次分派(dispatch)。AFAIK,单分派(dispatch)是根据调用者类型调用方法,而双分派(dispatch)是根据调用者类型和参数类型调用
我有一个非 ui 线程,我需要在该线程上发送消息。 执行此操作的正常方法是在我的线程的线程过程中调用 Dispatcher.Run()。 我想修改它以使其在处理未处理的异常方面更加健壮。 我的第一个剪
我有一个具有这样功能的代码 const mapDispatchToProps = (dispatch: Dispatch) => ({ onAddProduct: ( key: str
我在使用 Window.Show 显示 WPF 窗口时遇到问题: System.InvalidOperationException was unhandled Message: An unhandle
我对何时使用 Dispatcher.Invoke 从不同线程更新 UI 上的某些内容存有疑问。 这是我的代码... public Window4() { InitializeC
我遇到了一个我无法解决的问题。我正在构建一个电子商务 react 应用程序并使用 useReducer 和 useContext 进行状态管理。客户打开产品,挑选商品数量,然后单击“添加到购物车”按钮
尽管我已经深入了解了 NEventStore 上的事务完整性,但我无法理解在连接了许多 NEventStore 实例时 NEventStore 将如何真正扩展。 总结一下我的理解,一个事件被添加到提交
我学习了 React Javascript 和 Redux,现在我遇到了这个问题。 这是一个 codesandbox 像这样尝试: 搜索书名“dep” 观察日志显示“Search url is:”,当
Dispatcher.CurrentDispatcher(在System.Windows.Threading中)和Application.Current.Dispatcher(在 >系统.Window
我得到了一些代码来处理调度程序在其构造函数中传递给 View 模型的位置。我现在想知道当我想要在 UI 线程上执行某些操作时,我是否应该使用 ObserveOn(dispatcher) 或 dispa
当我们的一个应用程序服务器内存不足时,我正在分析 Java 堆转储。我正在使用 Eclipse 内存分析器。它报告了以下内容。 One instance of "akka.dispatch.Dispa
哪一个: public static let barrier: DispatchWorkItemFlags public static let detached: DispatchWorkItem
我想使用不同于调度类型的类型提示 Action 创建者。 我已经尝试使用这两种类型对 ThunkResult 进行类型提示,但这并不理想。 // types.ts interface AppListA
我正在尝试准确地理解什么是单次分派(dispatch)和多次分派(dispatch)。 我刚刚读到这个: http://en.wikipedia.org/wiki/Multiple_dispatch
I have following api returning Flux of String我有以下返回字符串通量的接口 @GetMapping(value = "/api/getS
这是我自学前端开发一年后在Stackoverflow上的第一个问题。我已经找到了我的疑惑的答案,但由于这些问题是第三次返回,我认为是时候向 Web 提问了。 我正在尝试构建什么 我正在尝试构建一个图书
我正在使用 Kotlin 学习 Android,并且我了解到在不阻塞主线程的情况下启动协程的推荐方法是执行以下操作 MainScope().launch { withContext(Dispatc
错误本身: (alias) deleteCategory(id: number): (dispatch: Dispatch) => void import deleteCategory Argumen
我必须对抽屉进行裁剪,然后创建一个包含所有需要项的DrawerComponent,并创建一个带有NavigationActions的函数来调度我的路线,但是它不起作用。当我单击任何项目时,我都会遇
我是一名优秀的程序员,十分优秀!