Я пытаюсь реализовать Observables с реакцией / редукцией с асинхронными действиями, вот код моего эпоса, пока все работает правильно:
export function requestDataEpic (action$, store) {
return action$.pipe(ofType(REQUEST_DATA),
mergeMap(({ payload }) => {
return Observable.ajax.get(`${API_URL}/${payload.userId}`)
.flatMap((result) => {
return Observable.of(requestDataSucess({ result }))
})
.catch((error) => {
return Observable.of(requestDataFailure({ error }))
})
}),
catchError((error) => {
alertError({ error })
return empty()
})
)
}
Это работает отлично, как и ожидалось.
Теперь проблема возникает, когда я пытаюсь вызвать мою функцию getData (которая выполняет асинхронный вызов) вместо прямого вызова Observable.ajax.get .Я хотел бы вызвать эту функцию, которая будет проверять токен API, а затем обрабатывать вызов Observable.ajax, например:
export default async function getData ({ URL, userId }) {
const { token } = await verifyToken()
const params = {
token,
userId,
}
const query = Object.keys(params)
.map((key) => key + '=' + params[key])
.concat(fields)
.join('&')
return Observable.ajax.get(URL + query)
}
Таким образом, окончательный код будет выглядеть следующим образом:
export function requestDataEpic (action$, store) {
return action$.pipe(ofType(REQUEST_DATA),
mergeMap(({ payload }) => {
return getData(API_URL, payload.userId)
.flatMap((result) => {
return Observable.of(requestDataSucess({ result }))
})
.catch((error) => {
return Observable.of(requestDataFailure({ error }))
})
}),
catchError((error) => {
alertError({ error })
return empty()
})
)
}
Я получаю (getData.default) (...) flatMap не является функцией
Если удалить асинхронное слово в объявлении функции + удалитьawait verifyToken (), затем он снова работает.
Есть вещи, которые я не до конца понимаю, я не могу превратить все в Observable, мне нужно продолжать использовать асинхронные вещи.
Любая помощьбыло бы здорово.
Спасибо