Firebase 抛出的错误在 redux-thunk 操作的 then() 中被捕获
Error thrown by Firebase is caught in then() of redux-thunk action
如果由于互联网连接速度慢而需要很长时间才能解决请求,Firebase 会报错。这是错误:
@firebase/firestore: Firestore (7.9.2): Could not reach Cloud Firestore backend. Connection failed 1 times. Most recent error: FirebaseError: [code=unavailable]: The operation could not be completed
This typically indicates that your device does not have a healthy Internet connection at the moment. The client will operate in offline mode until it is able to successfully connect to the backend.
我 运行 在尝试捕获此错误时遇到了 redux-thunks 的奇怪行为。我的 api 函数能够在其 catch()
块中捕获 firebase 错误,但未在 thunk 操作中的 catch()
块中捕获。这里有一些伪代码可以更好地说明这一点:
api.js
getDoc () {
return firebase.firestore().doc().get().then(result => {
return result
}).catch(error => {
//error caught here
console.log(error)
})
}
thunks.js
action () {
api.getDoc().then(result => {
//result contains the error
dispatch(success(result));
})
.catch(error => {
//not being reached
dispatch(failed(error))
})
}
我创建了一个 code sandbox 来重现错误。随意使用代码。当您在应用程序正在获取数据时离线时,将抛出 firebase 错误,并且控制台将显示后端 api 捕获了错误,但 thunk 操作未能捕获到错误。
我不确定这是我的错误还是 redux-thunk 库或 firebase 库的限制。
问题:我该如何处理这个错误,这样我的 thunk 操作就不会将错误发送为成功?
我们将热烈欢迎任何帮助。
该消息只是给您的通知。这不是一个真正的错误,你无法捕捉到它。 Firestore 不会将网络问题视为错误。它只是在后台不断重试。
如果有人遇到此错误,这里有一个解决方案。
最简单的解决方案是从 api 函数中删除 catch()
块并在调用函数处捕获错误。根据问题中提供的示例代码,唯一的修改是 api.js 文件:
getDoc () {
return firebase.firestore().doc().get().then(result => {
return result
})
}
在测试时,如果错误被 firebase 抛出,thunk 的 catch()
块会被命中,从而调度错误操作。
如果由于互联网连接速度慢而需要很长时间才能解决请求,Firebase 会报错。这是错误:
@firebase/firestore: Firestore (7.9.2): Could not reach Cloud Firestore backend. Connection failed 1 times. Most recent error: FirebaseError: [code=unavailable]: The operation could not be completed This typically indicates that your device does not have a healthy Internet connection at the moment. The client will operate in offline mode until it is able to successfully connect to the backend.
我 运行 在尝试捕获此错误时遇到了 redux-thunks 的奇怪行为。我的 api 函数能够在其 catch()
块中捕获 firebase 错误,但未在 thunk 操作中的 catch()
块中捕获。这里有一些伪代码可以更好地说明这一点:
api.js
getDoc () {
return firebase.firestore().doc().get().then(result => {
return result
}).catch(error => {
//error caught here
console.log(error)
})
}
thunks.js
action () {
api.getDoc().then(result => {
//result contains the error
dispatch(success(result));
})
.catch(error => {
//not being reached
dispatch(failed(error))
})
}
我创建了一个 code sandbox 来重现错误。随意使用代码。当您在应用程序正在获取数据时离线时,将抛出 firebase 错误,并且控制台将显示后端 api 捕获了错误,但 thunk 操作未能捕获到错误。 我不确定这是我的错误还是 redux-thunk 库或 firebase 库的限制。
问题:我该如何处理这个错误,这样我的 thunk 操作就不会将错误发送为成功?
我们将热烈欢迎任何帮助。
该消息只是给您的通知。这不是一个真正的错误,你无法捕捉到它。 Firestore 不会将网络问题视为错误。它只是在后台不断重试。
如果有人遇到此错误,这里有一个解决方案。
最简单的解决方案是从 api 函数中删除 catch()
块并在调用函数处捕获错误。根据问题中提供的示例代码,唯一的修改是 api.js 文件:
getDoc () {
return firebase.firestore().doc().get().then(result => {
return result
})
}
在测试时,如果错误被 firebase 抛出,thunk 的 catch()
块会被命中,从而调度错误操作。