Как обрабатывать `UnhandledPromiseRejectionWarning` при использовании Observable.from(‹Promise›) и обнаружении ошибки в Observable

Я использую redux-observable вместе с isomorphic-fetch для обработки http-запросов в моем приложении React. Я предпочитаю эту комбинацию использованию ajax rxjs, потому что я тестирую с помощью Jest, который запускает тесты в Node.js-, и хочу перехватывать HTTP-запросы с помощью nock. См. этот связанный вопрос: Используйте выборку вместо ajax с избыточным наблюдаемым.

Итак, вот проблема: я получаю UnhandledPromiseRejectionWarning вместе со страшным: DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code., потому что я не ловлю отказы от обещаний напрямую, а оставляю это на усмотрение Observable:

// apiModule.js
import fetch from 'isomorphic-fetch'

const api = {
  getSomething: () => {
    const request = fetch('http://some-api/')
      .then(res => catchError(res)) // throwing an Error here if not response.ok
      .then(res => res.json())

    return Observable.from(request)
  }
}

Затем в былине:

// myReduxModule.js
import {api} from './apiModule.js'

const getSomethingEpic = action$ =>
  action$
    .ofType(GET_SOMETHING)
    .mergeMap(action =>
      api
        .getSomething()
        .map(response => getSomethingSucceeded(response))
        .catch(error => logError(error)) // error is handled here!
    )

Таким образом, отказ от обещания обрабатывается в Observable, но не напрямую!

Любые предложения, как избежать предупреждения (и возможного будущего завершения с ненулевым кодом выхода) в этом сценарии?


person mcmunder    schedule 08.06.2017    source источник


Ответы (1)


С этого момента каждый раз, когда у вас есть промис и вы вызываете then, вы должны также реализовывать catch. Также в ваших тестах.

 const request = fetch('http://some-api/')
      .then(res => catchError(res))
      .then(res => res.json())
      .catch(err => catchError(res)) // <= here you should implement the catch
person Ematipico    schedule 08.06.2017