我正在使用ngrx/store 1.5以及thunk中间件的应用程序,我正在尝试移动到ngrx/store 2.0和ngrx/effects.关于如何处理多个相关的动作和/或效果,我有几个问题.
我意识到thunks vs effect的"心态"是不同的,我试图了解差异.我已经查看了可用的示例应用程序,并且没有找到任何看起来适合我正在尝试的内容,所以也许我仍然接近它完全错误.
场景1
以下是处理向服务器发出登录请求的副作用:
@Effect login$: any = this.updates$
.whenAction(LoginActions.LOGIN)
.map(toPayload)
.switchMap(payload =>
this.loginService.login(payload.user, payload.password)
.map(result => this.actions.loginSuccess(value))
.catch((error) => Observable.of(this.loginError(error)))
));
Run Code Online (Sandbox Code Playgroud)
鉴于最初的副作用,成功登录时触发导航到"主页"屏幕的"正确"或"建议"方式是什么?这也可以概括为简单地触发一系列动作或操作.
我考虑过几个选项:
(a)登录成功触发的另一个效果,即触发后续动作以触发导航?
@Effect navigateHome$: any = this.updates$
.whenAction(LoginActions.LOGIN_SUCCEEDED)
.mapTo(this.actions.navigateHome());
Run Code Online (Sandbox Code Playgroud)
(b)登录成功触发的另一个效果,即执行导航操作?
@Effect navigateHome$: any = this.updates$
.whenAction(LoginActions.LOGIN_SUCCEEDED)
.do(this.navigateHome())
.filter(() => false);
Run Code Online (Sandbox Code Playgroud)
(c)将额外行动与初始登录效果所发出的行动联系起来?(样本显然不太正确,但给出了想法)
@Effect login$: any = this.updates$
.whenAction(LoginActions.LOGIN)
.map(toPayload)
.switchMap(password => Observable.concat(
this.loginService.login(passcode)
.map(result => this.actions.loginSuccess(value))
.catch((error) => Observable.of(this.loginError(error))),
Observable.of(this.actions.navigateHome())
));
Run Code Online (Sandbox Code Playgroud)
(d)其他?
情景2
考虑需要按顺序进行多个请求的情况,并且随着每个请求开始,我们想要更新"状态"以便可以向用户提供反馈.
这些行中某事的thunk示例:
multiphaseAction() {
return (dispatch) => {
dispatch(this.actions.updateStatus('Executing phase 1'); …
Run Code Online (Sandbox Code Playgroud) 是否可以使用Jackson设置Jersey以使用多个配置进行序列化/反序列化ObjectMappers
?
我希望能够做的是注册一个"默认"杰克逊ObjectMapper
,然后能够注册另一个功能,提供ObjectMapper
一些特殊配置,在某些情况下将"覆盖""默认" ObjectMapper
.
例如,这ContextResolver
将是"默认"映射器:
@Provider
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class JacksonMapperProvider implements ContextResolver<ObjectMapper> {
private final ObjectMapper mObjectMapper;
public JacksonMapperProvider() {
mObjectMapper = createMapper();
}
protected abstract ObjectMapper createMapper() {
ObjectMapper mapper = createMapper();
return mapper
.setSerializationInclusion(Include.ALWAYS)
.configure(JsonParser.Feature.ALLOW_COMMENTS, true)
.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true)
.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true)
.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
}
@Override
public ObjectMapper getContext(Class<?> type) {
return mObjectMapper;
}
}
Run Code Online (Sandbox Code Playgroud)
这ContextResolver
将覆盖"默认"映射器:
@Provider
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class SpecializedMapperProvider implements ContextResolver<ObjectMapper> {
private final ObjectMapper mObjectMapper; …
Run Code Online (Sandbox Code Playgroud) 我在我的 Angular 2 应用程序中使用 @ngrx/effects 并且我在尝试实现依赖于基于应用程序状态的条件的效果时遇到了一些问题。
在我的州,我有一张位置地图 -> 功能,键控locationId
(以及其他位置地图 -> *)。当ACTION_A
发生时,我只希望它在当前位置有最新的功能时继续。当ACTION_A
被分派,能力可能已达到最新的,但是,应用程序也可以在装入新的进程。
使用下面的代码,一次ACTION_A
被分派一次,isOutOfDate
每次任何动作被分派到商店时都会被调用。因此,即使在满足最新的过滤器之后,observable 似乎仍然处于活动状态。但是,如果getCapabilities
被替换为getCapabilitiesWorking
, thenisOutOfDate
只会在每次ACTION_A
分派动作时调用,直到满足过滤条件,正如我对任一实现所期望的那样。
所以,似乎我在如何combineLatest
或filter
或如何take
工作方面遗漏了一些东西......
或者也许我正在接近这一切都是错误的......
我宁愿能够为我的“当前位置”选择器使用通用功能
有任何想法吗?
@Effect() route$ = actions$
.ofType(ACTION_A)
.switchMap(() => this._store.let(getCapabilities)
.filter(capabilities => !isOutOfDate(capabilities))
.take(1)
)
.map( do some stuff );
// Selector function that causes excess observable emits
export const getCapabilities =
compose(fromLocations.currentLocationLookup(fromLocations.getCapabilities), fromRoot.getLocations); …
Run Code Online (Sandbox Code Playgroud)