使用 Observable.from(<Promise>) 时如何处理 UnhandledPromiseRejectionWarning 并在 Observable 中捕获错误

How to handle `UnhandledPromiseRejectionWarning` when using Observable.from(<Promise>) and catching error in the Observable

我正在使用 redux-observableisomorphic-fetch 来处理我的 React 应用程序中的 http 请求。我更喜欢这种组合而不是使用 rxjs 的 ajax,因为我正在使用 Jest 进行测试 - 它在 Node.js 中运行测试 - 并希望使用 nock 拦截 http 请求。请参阅此相关问题:

所以这就是问题所在:我得到一个 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!
    )

所以 promise 拒绝是在 Observable 中处理的,而不是直接处理的!

关于如何在这种情况下避免警告(以及将来可能以 non-zero 退出代码终止)的任何建议?

从现在开始,每次您有承诺并调用 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