使用fetch而不是ajax来减少可观察到的

使用fetch而不是ajax来减少可观察到的

问题描述:

redux-observable中可以使用isomporphic-fetch而不是Rx.DOM.ajax使用fetch而不是ajax来减少可观察到的

(注:RX.DOM.ajax是RxJS V4,并且不与redux-observable需要RxJS v5工作,V5相对应的是Rx.Observable.ajaximport { 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),因为承诺无法取消。 (截止撰写时)

+0

谢谢你,杰伊,为解释! – zatziky