Получение значения из селектора магазина в switchMap rxjs - PullRequest
0 голосов
/ 18 июня 2020

На самом деле, у меня есть последовательные шаги и я использую switchMap в эффекте store. Я хотел бы получить значение из магазина и получить его в 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 Ответ

1 голос
/ 18 июня 2020

Ваш код неверен, как только вы вводите функцию switchMap, вы больше не находитесь в наблюдаемом, поэтому у вас возникли проблемы, связанные с withLatestFrom. SwitchMap также возвращает массив и создает наблюдаемый объект, что означает, что вам не нужно использовать (). То, что я сказал в комментарии, будет выглядеть так: вам нужен новый эффект и новое действие (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;
}
...