从switchMap rxjs中的商店选择器获取价值

时间:2020-06-18 20:07:47

标签: javascript angular rxjs ngrx store

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

实际结果: var客户:任意

预期结果: 客户在商店中的类型应为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”。

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

1 个答案:

答案 0 :(得分:1)

您的代码是错误的,一旦您进入switchMap函数,您就不再处于可观察状态,因此这就是您与withLatestFrom相关的问题的原因。 SwitchMap还返回一个数组并创建一个observable,这意味着您不必使用of()。 我在评论中说的内容如下: 您需要一个新的效果和一个新的动作(loadOk)。我不知道该动作是否需要参数,因为它很难遵循。

  File "/Users/c/Development/ub/app/blueprints/p/p.py", line 201, in update_existing
    return jsonify(validator.errors), 422
  File "/Users/c/.pyenv/versions/3.8.1/envs/ub/lib/python3.8/site-packages/cerberus/validator.py", line 464, in errors
    return self.error_handler(self._errors)
  File "/Users/c/.pyenv/versions/3.8.1/envs/ub/lib/python3.8/site-packages/cerberus/errors.py", line 493, in __call__
    self.extend(errors)
  File "/Users/c/.pyenv/versions/3.8.1/envs/ub/lib/python3.8/site-packages/cerberus/errors.py", line 397, in extend
    self.add(error)
  File "/Users/c/.pyenv/versions/3.8.1/envs/ub/lib/python3.8/site-packages/cerberus/errors.py", line 510, in add
    error = deepcopy(error)
  File "/Users/c/.pyenv/versions/3.8.1/lib/python3.8/copy.py", line 172, in deepcopy
    y = _reconstruct(x, memo, *rv)
  File "/Users/c/.pyenv/versions/3.8.1/lib/python3.8/copy.py", line 269, in _reconstruct
    state = deepcopy(state, memo)
  File "/Users/c/.pyenv/versions/3.8.1/lib/python3.8/copy.py", line 146, in deepcopy
    y = copier(x, memo)
  File "/Users/c/.pyenv/versions/3.8.1/lib/python3.8/copy.py", line 229, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/Users/c/.pyenv/versions/3.8.1/lib/python3.8/copy.py", line 146, in deepcopy
    y = copier(x, memo)
  File "/Users/c/.pyenv/versions/3.8.1/lib/python3.8/copy.py", line 229, in _deepcopy_dict
    y[deepcopy(key, memo)] = deepcopy(value, memo)
  File "/Users/c/.pyenv/versions/3.8.1/lib/python3.8/copy.py", line 161, in deepcopy
    rv = reductor(4)
TypeError: cannot pickle 'dict_keys' object