【问题标题】:Getting value from store selector in switchMap rxjs从switchMap rxjs中的商店选择器获取价值
【发布时间】:2020-10-09 00:22:57
【问题描述】:

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

实际结果: var 客户:任何

预期结果: clients 应该是 store 中的 getClients 类型。

在代码中,我想在下一行代码中从 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))
  }
})
)

我收到如下错误:

“您在预期流的位置提供了 'undefined'。您可以提供 Observable、Promise、Array 或 Interable”

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

【问题讨论】:

  • 您不能只在 rxjs 运算符之间添加 if。为什么不将效果拆分为多个效果?我要做的是在 if 和 else 中分派一个动作来帮助您处理问题,因此您将有一个父效果来检查状态,如果状态正常,然后分派一个执行内部操作的动作if and if it not ok dispatch an action that do what is inside the else.
  • 如果你能给我指导,我是 rxjs 的新手。谢谢!
  • 我更新了我的答案,因为它没有意义。

标签: javascript angular rxjs ngrx store


【解决方案1】:

您的代码是错误的,一旦您进入 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;
}

【讨论】:

  • 代码运行良好,但我收到与以下相同的错误:“您在预期流的位置提供了'未定义'。您可以提供 Observable、Promise、Array 或 Interable”。 @ukn
  • 当我把console.log 放在return [new formActions.LoadOk]; 之前。它不打印。
  • 我在 if 条件之间添加了 switchMap(()=>{ return [new fromActions.LoadOk()]; 因为它向您的代码抱怨数据类型。
  • 你不能随机添加一个 switchMap 并期望它工作。你知道你可以在浏览器中调试它,看看它是否达到了 if。
  • 它没有到达那里。我调试过了。
猜你喜欢
  • 1970-01-01
  • 2020-08-18
  • 2021-10-21
  • 2019-11-19
  • 2016-10-03
  • 2019-03-28
  • 1970-01-01
  • 2011-12-01
  • 2022-01-11
相关资源
最近更新 更多