使用 Observable.from(<Promise>) 时如何处理 UnhandledPromiseRejectionWarning 并在 Observable 中捕获错误
How to handle `UnhandledPromiseRejectionWarning` when using Observable.from(<Promise>) and catching error in the Observable
我正在使用 redux-observable
和 isomorphic-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
我正在使用 redux-observable
和 isomorphic-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