2017-07-03 120 views
3

我如何轉換任何Fetch API返回RxJS ObservableRxJS.fromPromise有幫助嗎?如何將Fetch API響應轉換爲RxJS Observable?

+1

你可能要考慮採用了棱角分明的HTTP服務,如果您使用的角度或RxJS的['AjaxObservable'](https://github.com/ReactiveX/ rxjs/blob/5.4.1/src/observable/dom/AjaxObservable.ts#L101-L126)。他們有可取消的優勢;承諾不能被取消。 – cartant

+0

這是一個使用Observable的Angular應用程序,但此應用程序在Web工作人員中工作。 Angular HTTP與web worker不兼容。我不得不破解它的工作。沒有它仍然使用'''XMLHttpRequest''' compred到FetchAPI具有比'''XMLHttpRequest'''更好的性能? –

回答

2

退房這個article

var result = Rx.Observable.fromPromise(fetch('http://myserver.com/')); 
result.subscribe(x => console.log(x), e => console.error(e)); 
1

由於獲取調用返回尚未包含響應對象的另一個承諾,我會去創建自己觀察到的:

import { Observable } from 'rxjs'; 
 
import 'rxjs/add/operator/map'; 
 

 
const data$ = Observable.create(observer => { 
 
    fetch('http://server.com') 
 
    .then(response => response.json()) // or text() or blob() etc. 
 
    .then(data => { 
 
     observer.next(data); 
 
     observer.complete(); 
 
    }) 
 
    .catch(err => observer.error(err)); 
 
}); 
 

 
data$.subscribe(data => /*do something with data*/);

+0

真的不明白爲什麼這是downvoted。我認爲它實際上是一個更爲可靠的解決方案,即可接受的答案。 'Observable.fromPromise(fetch(..))'會立即觸發請求,而上面的命令會在'.subscribe()'之後有效地啓動它。 –

1

有庫文庫rxjs-fetch,但我建議不要使用它,而是寫:

const getData = (url, params) => { 
    return fetch(url, params).then(r => { 
     return r.ok ? r.text() : Promise.reject(`${r.statusText} ${r.status}`) 
    }) 
} 

const getDataObserver = (url, params) => Rx.Observable.fromPromise(getData()) 

(在你的NodeJS需要node-fetch