从 switchMap rxjs 中的存储选择器获取值



实际上,我有一系列步骤,并在存储的效果中使用switchMap。我想从商店中获取值并在 switchMap 中检索它。我尝试了如下方法,但我无法获得所需的类型值

实际结果:变量客户端:任意

预期结果:客户端的类型应为存储中的 getClient。

在代码中,我想在下一行代码中从withLatestFrom获取到switchMap的值。在代码中注释为 TODO。

@Effect()
loadInResponse$ = this.actions.ofType(fromActions.LOAD_IN).pipe(
withLatestFrom(this.store.select(getNqResponse)),
switchMap(([action, nq]) => {
if (nq.httpStatus === 'OK') {
withLatestFrom(this.store.select(getClients)), //TODO here
switchMap(([action,clients]) => {              //TODO here
var i;
var result = [];
console.log(clients);
for (i = 0; i < clients.length; i++) {
result[i] = clients.map(a => a.no);
}
return this.cinReuseService.InCall(result).pipe(
switchMap(responseIn => [
new fromActions.LoadInSuccess(responseIn),
new fromActions.LoadService()
]),
catchError(error => {
let err: responseService = {
status: "FALSE",
message: error
}
return of(new fromActions.LoadInFail(err))
})
) 
})
} else {
let err: responseService = {
status: "FALSE",
message: nq.message
}
return of(new fromActions.LoadInFail(err))
}
})
)

我收到如下错误:

"您在预期流的位置提供了'未定义'。您可以提供可观察、承诺、数组或可交互"。

我将非常感谢您的帮助。谢谢!

你的代码是错误的,一旦你进入switchMap函数,你就不再处于可观察状态,所以这就是为什么你遇到了与withLatestFrom相关的问题。SwitchMap 还返回一个数组并创建一个可观察量,这意味着您不必使用 of((。 我在评论中所说的看起来像这样: 你需要一个新的效果和一个新的动作(loadOk(。我不知道该动作是否需要参数,因为它有点难以遵循。

@Effect()
loadInResponse$ = this.actions.ofType(fromActions.LOAD_IN).pipe(
withLatestFrom(this.store.select(getNqResponse)),
switchMap(([action, nq]) => {
if (nq.httpStatus === 'OK') {
return [new formActions.LoadOk];
} else {
let err: responseService = {
status: "FALSE",
message: nq.message
};
return [new fromActions.LoadInFail(err)];
}
})

@Effect() okResponse = this.actions.ofType(fromActions.LOAD_OK).pipe(
withLatestFrom(this.store.select(getClients)),
switchMap(([action,clients]) => this.cinReuseService.InCall(this.result(clients))),
switchMap(responseIn => [
new fromActions.LoadInSuccess(responseIn),
new fromActions.LoadService()
]),
catchError(error => {
let err: responseService = {
status: "FALSE",
message: error
}
return [new fromActions.LoadInFail(err)];
})
)
result(clients: []): [] {
var i;
var result = [];
for (i = 0; i < clients.length; i++) {
result[i] = clients.map(a => a.no);
}
return result;
}

最新更新