- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 redux-observable 中有以下场景。我有一个组件可以检测要使用哪个后端,并且应该设置 api-client 使用的后端 URL。客户端和 URL 都保存在全局状态对象中。
执行顺序应该是:1.检查后台2. 出错时替换状态中的后端 URL3. 使用新的后端状态 URL 触发 3 个 Action 来加载资源
到目前为止,我所做的是,在步骤 1 中,从我的史诗中访问 state$ 对象并修改支持的 URL。这似乎只奏效了一半。状态由 3 中触发的操作更新。仍然看到旧状态并使用错误的后端。
如果您依赖执行顺序,在操作之间更新状态的标准方法是什么?
我的 API-Epic 看起来像这样:
export const authenticate = (action$, state$) => action$.pipe(
ofType(actions.API_AUTHENTICATE),
mergeMap(action =>
from(state$.value.apiState.apiClient.authenticate(state$.value.apiState.bearer)).pipe(
map(bearer => apiActions.authenticatedSuccess(bearer))
)
)
)
export const authenticatedSuccess = (action$, state$) => action$.pipe(
ofType(actions.API_AUTHENTICATED_SUCCESS),
concatMap(action => concat(
of(resourceActions.doLoadAResource()),
of(resourceActions.doLoadOtherResource()),
of(resourceActions.doLoadSomethingElse()))
)
)
最佳答案
我发现用户在 GitHub 和 StackOverflow 上讨论的一种常见方法是链接多个史诗,就像我相信您的示例试图展示的那样。第一个史诗在“完成”时发送一个 Action 。 reducer 监听此操作并更新商店的状态。第二个史诗(如果您想要并发操作,则可以是许多其他史诗)监听相同的操作并启动工作流程的下一个序列。次级史诗在 reducer 之后运行,因此可以看到更新后的状态。 From the docs :
Epics run alongside the normal Redux dispatch channel, after the reducers have already received them...
我发现链接方法可以很好地解耦大型工作流的各个阶段。您可能出于设计原因(例如关注点分离)而希望解耦,以重用较大工作流的较小部分,或者制作较小的单元以便于测试。当您的史诗在较大工作流的不同阶段之间分派(dispatch)操作时,这是一种易于实现的方法。
但是,请记住 state$
是可观察的。您可以使用它在任何时间点获取当前 值——包括在单个史诗中调度不同操作之间。例如,考虑以下情况并假设我们的商店有一个简单的柜台:
export const workflow = (action$, state$) => action$.pipe(
ofType(constants.START),
withLatestFrom(state$),
mergeMap(([action, state]) => // "state" is the value when the START action was dispatched
concat(
of(actions.increment()),
state$.pipe(
first(),
map(state => // this new "state" is the _incremented_ value!
actions.decrement()),
),
defer(() => {
const state = state$.value // this new "state" is now the _decremented_ value!
return empty()
}),
),
),
)
有很多方法可以从 Observable 获取当前状态!
关于您示例中的以下代码行:
state$.value.apiState.apiClient.authenticate(state$.value.apiState.bearer)
首先,使用状态传递 API 客户端并不是一种常见/推荐的模式。你可能想看看 injecting the API client as a dependency到你的史诗(这使单元测试更容易!)。其次,不清楚 API 客户端如何从状态中获取当前后端 URL。 API 客户端是否可能正在使用状态的缓存版本?如果是,您可能需要重构您的 authenticate
方法并传入当前后端 URL。
这是一个处理错误并包含上述内容的示例:
/**
* Let's assume the state looks like the following:
* state: {
* apiState: {
* backend: "URL",
* bearer: "token"
* }
*/
// Note how the API client is injected as a dependency
export const authenticate = (action$, state$, { apiClient }) => action$.pipe(
ofType(actions.API_AUTHENTICATE),
withLatestFrom(state$),
mergeMap(([action, state]) =>
// Try to authenticate against the current backend URL
from(apiClient.authenticate(state.apiState.backend, state.apiState.bearer)).pipe(
// On success, dispatch an action to kick off the chained epic(s)
map(bearer => apiActions.authenticatedSuccess(bearer)),
// On failure, dispatch two actions:
// 1) an action that replaces the backend URL in the state
// 2) an action that restarts _this_ epic using the new/replaced backend URL
catchError(error$ => of(apiActions.authenticatedFailed(), apiActions.authenticate()),
),
),
)
export const authenticatedSuccess = (action$, state$) => action$.pipe(
ofType(actions.API_AUTHENTICATED_SUCCESS),
...
)
此外,在链接像 concat
这样构造的史诗时请记住,不会等待链接的史诗“完成”。例如:
concat(
of(resourceActions.doLoadAResource()),
of(resourceActions.doLoadOtherResource()),
of(resourceActions.doLoadSomethingElse()))
)
如果这些 doLoadXXX
操作中的每一个都“开始”一个史诗,那么这三个操作可能会同时运行。每个 Action 都会一个接一个地派发,每个史诗都会一个接一个地“开始”运行,而不用等待前一个“完成”。这是因为史诗从未真正完成。它们是长寿的、永无止境的流。如果你想 doLoadOtherResource
运行 after doLoadAResource
.
关于javascript - Redux-Observable:修改状态触发后续 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55569169/
我正在通读 Windows Phone 7.5 Unleashed,有很多代码看起来像这样(在页面的代码隐藏中): bool loaded; protected override void OnNav
在cgi服务器中,我这样返回 print ('Status: 201 Created') print ('Content-Type: text/html') print ('Location: htt
我正在查看 esh(easy shell)的实现,无法理解在这种情况下什么是 22 和 9 信号。理想情况下,有一个更具描述性的常量,但我找不到列表。 最佳答案 信号列表及其编号(包括您看到的这两个)
我的Oozie Hive Action 永远处于运行模式。 oozie.log文件中没有显示错误。
我正在编写一个使用 RFCOMM 通过蓝牙连接到设备的 Android 应用程序。我使用 BluetoothChat 示例作为建立连接的基础,大部分时间一切正常。 但是,有时由于出现套接字已打开的消息
我有一个云调度程序作业,它应该每小时访问我的 API 以更新一些价格。这些作业大约需要 80 秒才能运行。 这是它的作用: POST https://www.example.com/api/jobs/
我正在 Tomcat 上访问一个简单的 JSP 页面: 但是当我使用 curl 测试此页面时,我得到了 200 响应代码而不是预期的 202: $ curl -i "http://localhos
有时 JAR-RS 客户端会发送错误的语法请求正文。服务器应响应 HTTP status 400 (Bad Request) , 但它以 HTTP status 500 (Internal Serve
我正在尝试通过 response.send() 发送一个整数,但我不断收到此错误 express deprecated res.send(status): Use res.sendStatus(sta
我已经用 Excel 和 Java 做过很多次了……这次我需要用 Stata 来做,因为保存变量更方便'labels .如何将 dataset_1 重组为下面的 dataset_2? 我需要转换以下
我正在创建一个应用程序,其中的对象具有状态查找功能。为了提供一些上下文,让我们使用以下示例。 帮助台应用程序,其中创建作业并通过以下工作流程移动: 新 - 工作已创建但未分配 进行中 - 分配给工作人
我想在 Keras 中运行 LSTM 并获得输出和状态。在 TF 中有这样的事情 with tf.variable_scope("RNN"): for time_step in range
有谁知道 Scala-GWT 的当前状态 项目? 那里的主要作者 Grzegorz Kossakowski 似乎退出了这个项目,在 Spring 中从事 scalac 的工作。 但是,在 interv
我正在尝试编写一个 super 简单的 applescript 来启动 OneDrive App , 或确保打开,当机器的电源设置为插入时,将退出,或确保关闭,当电源设置为电池时。 我无法找到如何访问
目前我正在做这样的事情 link.on('click', function () { if (link.attr('href') !== $route.current.originalPath
是否可以仅通过查看用户代理来检测浏览器上是否启用/禁用 Javascript。 如果是,我应该寻找什么。如果否,检测用户浏览器是否启用/禁用 JavaScript 的最佳方法是什么 最佳答案 不,没有
Spring 和 OSGi 目前的开发状况如何? 最近好像有点安静了。 文档的最新版本 ( http://docs.spring.io/osgi/ ) 来自 2009 年。 我看到一些声明 Sprin
我正在从主函数为此类创建一个线程,但即使使用 Thread.currentThread().interrupt() 中断它,输出仍然包含“Still Here”行。 public class Writ
为了满足并发要求,我想知道如何在 Godog 中的多个步骤之间传递参数或状态。 func FeatureContext(s *godog.Suite) { // This step is ca
我有一个UIButton子类,它不使用UIImage背景,仅使用背景色。我注意到的一件事是,当您设置按钮的背景图像时,有一个默认的突出显示状态,当按下按钮时,该按钮会稍微变暗。 这是我当前的代码。
我是一名优秀的程序员,十分优秀!