2017-07-03 87 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