Используйте fetch вместо ajax с redux-observable

на redux-observable можно использовать isomporphic-fetch вместо Rx.ДОМ.ajax?

1 ответов


(Примечание: RX.DOM.ajax от RxJS v4, и не работает с redux-observable что требует RxJS v5. Эквивалент в v5 -Rx.Observable.ajax или import { ajax } from 'rxjs/observable/ajax';)

можно использовать fetch() а также любой другой API AJAX; хотя некоторые адаптируются легче, чем другие!

на fetch() API возвращает Promise, который RxJS v5 имеет встроенная поддержка. Большинство операторов, ожидающих наблюдаемого может потреблять обещания как есть (например mergeMap, switchMap и т. д.). Но часто вы захотите применить операторы Rx к обещанию, прежде чем передавать его остальной части вашего эпоса, поэтому вы часто захотите обернуть обещание внутри наблюдаемого.

вы можете обернуть обещание в наблюдаемое с 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, выход


если у вас есть контроль над кодом API, в идеале вы бы использовали Observable.ajax (или любые другие наблюдаемые на основе AJAX utils), потому что обещания не могут быть отменены. (на момент написания этой статьи)