【发布时间】:2019-10-10 04:29:50
【问题描述】:
所以我已经尝试了 2 天来解决这个问题,但我放弃了,rxjs 非常棘手,特别是对于 map 家庭。
我有一个以id为参数的动作MessageRequested,它应该启动一个api调用来获取消息,然后检查相应的访问者是否在商店中。如果它不在商店中,它将发送两个动作,MessageLoaded 和 VisitorRequested。如果它在商店中,我们将只发送一个操作,MessageLoaded。所以逻辑应该是这样的:
-
MessageRequested以id作为输入进行调度 - 现在我们调用以
id为参数的api,我们返回了一个Message对象。消息定义如下。它有一个visitor_id属性:mergeMap((action) => this.converseService.getMessage( action[0].message_id )) - 现在我们查询商店,
Message对象中的visitor_id是否存在于Visitor状态(this.store.pipe(select(selectVisitorById( m.visitor_id ) )) -
现在我们有了一个需要应用的 if 条件,
一个。如果
select返回了一些东西,那么访客已经在商店中,我们将只返回MessageLoaded操作。b.如果
select没有返回visitor,我们现在必须发送一个额外的操作VisitorRequested来请求访问者。我们仍然需要发送MessageLoaded操作。这就是 2 个动作。
现在是代码:
loadMessage$ = this.actions$
.pipe(
ofType<MessageRequested>(MessageActionTypes.MessageRequested),
mergeMap((action) => this.converseService.getMessage( action[0].message_id )),
map(m => m.model),
withLatestFrom( this.store.pipe(select(selectVisitorById( m.visitor_id ) ))),
tap( ([message,visitor]) => {
if (visitor == null) new VisitorRequested(message.visitor_id);
}),
map( ([message, visitor]) => {
return new MessageLoaded({message});
} )
);
export class Message {
id: number;
message: string;
visitor_id: number;
is_from_visitor: boolean;
created_at: string;
}
export class MessageResponse extends Response {
model: Message
}
export class Response{
message:String;
didError: boolean;
errorMessage: string;
}
代码看起来没问题,只是withLatestFrom 不接受输入,所以我无法传递m.visitor_id 变量,现在我不得不想另一种方法。我尝试使用forkJoin 和concatMap,但没有成功。
在场景中使用哪些合适的运算符?
更新 #1
在所有答案的帮助下,这终于奏效了:
@Effect()
loadMessage$ = this.actions$
.pipe(
ofType<MessageRequested>(MessageActionTypes.MessageRequested),
mergeMap((action) => this.converseService.getMessage( action.message_id )),
map(m => m.model),
concatMap(message =>
of(message).pipe(
withLatestFrom(this.store.pipe(select(selectVisitorById(message.visitor_id))))
)
),
tap( ([message,visitor]) => {
if (!(visitor)) this.store.dispatch(new VisitorRequested(message.visitor_id));
}),
map( ([message, visitor]) => {
return new MessageLoaded({message});
} )
);
【问题讨论】:
标签: angular rxjs ngrx ngrx-effects