2016-07-26 54 views

回答

35

(注: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