在 redux-observable 中使用 fetch 而不是 ajax
Use fetch instead of ajax with redux-observable
在redux-observable
中可以使用isomporphic-fetch instead of Rx.DOM.ajax吗?
(注意:RX.DOM.ajax
来自 RxJS v4,不适用于需要 RxJS v5. The equivalent in v5 is Rx.Observable.ajax
或 [=15 的 redux-observable
=])
确实可以使用 fetch()
以及任何其他 AJAX API;虽然有些人比其他人更容易适应!
fetch()
API returns a Promise
,RxJS v5 内置支持。大多数期望可观察对象的运算符都可以按原样使用 Promise(如 mergeMap
、switchMap
等)。但通常您会希望在将 Promise 传递给 Epic 的其余部分之前将 Rx 运算符应用于 Promise,因此您通常希望将 Promise 包装在 Observable 中。
您可以使用 Observable.from(promise)
将 Promise 包装到 Observable 中
这是一个示例,我在其中获取用户,请求 JSON 响应,然后将承诺包装在可观察对象中:
const api = {
fetchUser: id => {
const request = fetch(`https://jsonplaceholder.typicode.com/users/${id}`)
.then(response => response.json());
return Observable.from(request);
}
};
然后您可以在 Epic 中使用它并应用您想要的任何运算符:
const fetchUserEpic = action$ =>
action$.ofType(FETCH_USER)
.mergeMap(action =>
api.fetchUser(action.payload) // This returns our Observable wrapping the Promise
.map(payload => ({ type: FETCH_USER_FULFILLED, payload }))
);
这是一个带有这个工作示例的 JSBin:https://jsbin.com/fuwaguk/edit?js,output
如果您可以控制 API 代码,理想情况下您会使用 Observable.ajax
(或任何其他基于 Observable 的 AJAX 实用程序),因为 Promises 无法取消。 (截至撰写本文时)
对@jayphelps 进行了小幅调整以使该代码对我有用。希望这有助于节省某人的时间。
import { FETCH_USER } from './actions'
import { ofType } from 'redux-observable'
import { map, mergeMap } from 'rxjs/operators'
import { from } from 'rxjs'
const fetchUserEpic = action$ => {
return action$.pipe(
ofType(FETCH_USER),
mergeMap((action = { user: 'redux-observable' }) => {
const getRequest = (user) => {
const request = fetch(`https://api.github.com/users/${user}`)
.then(response => response.json())
return from(request)
}
return getRequest(action.user).pipe(
map(payload => ({ type: FETCH_USER_FULFILLED, payload }))
)
})
)
}
在redux-observable
中可以使用isomporphic-fetch instead of Rx.DOM.ajax吗?
(注意:RX.DOM.ajax
来自 RxJS v4,不适用于需要 RxJS v5. The equivalent in v5 is Rx.Observable.ajax
或 [=15 的 redux-observable
=])
确实可以使用 fetch()
以及任何其他 AJAX API;虽然有些人比其他人更容易适应!
fetch()
API returns a Promise
,RxJS v5 内置支持。大多数期望可观察对象的运算符都可以按原样使用 Promise(如 mergeMap
、switchMap
等)。但通常您会希望在将 Promise 传递给 Epic 的其余部分之前将 Rx 运算符应用于 Promise,因此您通常希望将 Promise 包装在 Observable 中。
您可以使用 Observable.from(promise)
这是一个示例,我在其中获取用户,请求 JSON 响应,然后将承诺包装在可观察对象中:
const api = {
fetchUser: id => {
const request = fetch(`https://jsonplaceholder.typicode.com/users/${id}`)
.then(response => response.json());
return Observable.from(request);
}
};
然后您可以在 Epic 中使用它并应用您想要的任何运算符:
const fetchUserEpic = action$ =>
action$.ofType(FETCH_USER)
.mergeMap(action =>
api.fetchUser(action.payload) // This returns our Observable wrapping the Promise
.map(payload => ({ type: FETCH_USER_FULFILLED, payload }))
);
这是一个带有这个工作示例的 JSBin:https://jsbin.com/fuwaguk/edit?js,output
如果您可以控制 API 代码,理想情况下您会使用 Observable.ajax
(或任何其他基于 Observable 的 AJAX 实用程序),因为 Promises 无法取消。 (截至撰写本文时)
对@jayphelps 进行了小幅调整以使该代码对我有用。希望这有助于节省某人的时间。
import { FETCH_USER } from './actions'
import { ofType } from 'redux-observable'
import { map, mergeMap } from 'rxjs/operators'
import { from } from 'rxjs'
const fetchUserEpic = action$ => {
return action$.pipe(
ofType(FETCH_USER),
mergeMap((action = { user: 'redux-observable' }) => {
const getRequest = (user) => {
const request = fetch(`https://api.github.com/users/${user}`)
.then(response => response.json())
return from(request)
}
return getRequest(action.user).pipe(
map(payload => ({ type: FETCH_USER_FULFILLED, payload }))
)
})
)
}