使用fetch而不是ajax来减少可观察到的
答
(注:RX.DOM.ajax
是RxJS V4,并且不与redux-observable
需要RxJS v5工作,V5相对应的是Rx.Observable.ajax
或import { ajax } from 'rxjs/observable/ajax';
。)
这确实是可以使用fetch()
以及任何其他AJAX API;尽管有些适应比别人更容易!
的fetch()
API返回一个Promise
,其RxJS V5具有内置的支持。大多数期望可观察的操作员可以按原样使用Promise(如mergeMap
,switchMap
等)。但是,在将它传递给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
(或任何其他基于可观察-utils的AJAX),因为承诺无法取消。 (截止撰写时)
谢谢你,杰伊,为解释! – zatziky