Операции ajax
переносят XMLHttpRequest
, а XMLHttpRequest
автоматически следует за перенаправлениями. Хотя перенаправление не может быть предотвращено, оно может быть обнаружено. Вот еще один пример обнаружения перенаправления:
export const getData = action$ =>
action$.pipe(
ofType(GET_DATA_REQUEST),
mergeMap(action =>
ajax(options).pipe(
mergeMap(response => {
// Navigate to login if the request was successful but redirected
if (response.status >= 200 && response.status < 300 && response.responseURL !== options.url) {
window.location.href = 'login'
return empty()
}
return of(getDataSuccess(response.response))
})
)
)
)
Если вы хотите повторно использовать эту логику в нескольких эпосах, просто экспортируйте ее как функцию многократного использования:
export const ajaxWithLoginRedirect = options =>
ajax(options).pipe(
mergeMap(response => {
// Navigate to login if the request was successful but redirected
if (response.status >= 200 && response.status < 300 && response.responseURL !== options.url) {
window.location.href = 'login'
return empty()
}
// Return the raw response
return of(response)
})
)
export const getData = action$ =>
action$.pipe(
ofType(GET_DATA_REQUEST),
mergeMap(action =>
ajaxWithLoginRedirect(options).pipe(
// This is only called if we did not redirect
map(response => getDataSuccess(response.response))
)
)
)
Обратите внимание, что fetch
API поддерживает поддержку обработки перенаправлений вручную (объект ответа, который вы получите, будет иметь код состояния 3xx). Существует ряд компромиссов между XMLHttpRequest
и fetch
, поэтому я хотел бы выяснить, что если , а не , то в вашем приложении предпочтительнее автоматически выполнять следующие перенаправления.