Преобразование Promise в Observable с помощью React-Redux и TypeScript - PullRequest
1 голос
/ 08 октября 2019

Я знаю, что есть несколько доступных решений, но я не могу обернуться вокруг этой концепции. Я думаю, что было бы лучше, если бы я мог найти решение своей проблемы.

Я использую библиотеку, которая возвращает Promise, но я хочу сохранить этот ответ (независимо от того, успешен он или нет) в Redux.

interface IResponseType {
  accessToken: string;
}

const authLogin = (
  username: string,
  password: string
): Promise<IResponseType> => {
  return new Promise(resolve => {
    return resolve({ accessToken: "something" });
  });
};

export const loginEpic: IEpic = (
  action$: ActionsObservable<ITestLoadAction>,
  store: StateObservable<IStore>
): Observable<IAction> =>
  action$.ofType(TEST.REQUEST).pipe(
    from(authLogin("username", "password")).pipe(
      map(
        (response: IResponseType): IAction => testLoadSuccessAction(response)
      ),
      catchError(() =>
        ActionsObservable.of(testLoadFailedAction("Test Loading failed."))
      )
    )
  );

IAction

interface IAction {
    type: any;
    [key: string]: any;
}

IEpic

export type IEpic = Epic<IAction, IAction, IStore, EpicDependencies>;

Ошибка при наборе текста, которую я получаю

Argument of type 'Observable<IAction | ITestLoadFailedAction>' is not assignable to parameter of type 'OperatorFunction<ITestLoadAction, IAction>'.
  Type 'Observable<IAction | ITestLoadFailedAction>' provides no match for the signature '(source: Observable<ITestLoadAction>): Observable<IAction>'.ts(2345)

Я создал песочницу для этого. Кажется, выдает ошибку в редакторе, но компилируется нормально. Возможно, я допустил ошибку с некоторыми конфигурациями. Но вот ссылка, если это необходимо. https://codesandbox.io/embed/agitated-mccarthy-sfq01

enter image description here

1 Ответ

1 голос
/ 09 октября 2019

То, что вы хотите сделать, выполняется с помощью switchMap Operator Function.

action$.ofType(TEST.REQUEST).pipe(
      switchMap(() => from(authLogin("username", "password"))), 
      map(response => testLoadSuccessAction(response)),
      catchError(() => ActionsObservable.of(testLoadFailedAction("Test Loading failed."))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...