如何将Fetch API响应转换为RxJS Observable?

时间:2017-07-03 02:40:25

标签: rxjs es6-promise fetch-api

如何将Fetch API返回的任何内容转换为RxJS ObservableRxJS.fromPromise有帮助吗?

7 个答案:

答案 0 :(得分:17)

当fetch调用返回包含响应对象的另一个promise时,我会创建自己的observable:



import { Observable } from 'rxjs';

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*/);




答案 1 :(得分:9)

查看此article

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

答案 2 :(得分:4)

我正在使用rxjs @ 6。

接受可观察变量的运算符(例如flatMapswitchMap等)也可以接受promise。 这非常简单,如下所示。

somethingObservable.pipe(
    flatMap(() => fetch('http://some.api.com/post/1')),
    subscribe((response) => {
        console.log(response);
    }),
)

答案 3 :(得分:1)

存在libary 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

答案 4 :(得分:1)

我正在使用rxjs 6.5.3。我使用下面的示例将Fetch API响应转换为RxJS Observable。

const { from } = rxjs;
const { map, switchMap } = rxjs.operators


const observable = from(fetch('data/user.json')).pipe(
    switchMap(response => response.json())
)

observable.subscribe(function(result){
    console.log('result', result);
});

您还可以使用rxjs的 fromFetch。但是获取API仍处于实验阶段。

答案 5 :(得分:1)

对于 observable,建议取消提取:

function fetch$(url:string, options:RequestInit) {
  return new Observable<Response>(subscriber => {
    const controller = new AbortController();
    options.signal = controller.signal;
    fetch(url, options)
    .then(res => {
      subscriber.next(res);
      subscriber.complete();
    })
    .catch(er => subscriber.error(er));
    return () => { // <- return the observable teardown function
      controller.abort();
    }
  })
}

https://davidwalsh.name/cancel-fetch

答案 6 :(得分:0)

使用rxjs 6.4,您可以使用 from 运算符

查看此链接:https://www.learnrxjs.io/operators/creation/from.html

示例在TS中:

public getModelDetails(): Observable<YourType> {

const apiCall = fetch(`yourURL/modelDetails`)
                   .then(response => response.json())
                   .then(responseJson => {
                          return responseJson as YourType
                    })
return from(apiCall)

}