React native 无法捕获由redux saga调用()引发的错误,从而引发另一个saga
假设我有一个传奇故事:React native 无法捕获由redux saga调用()引发的错误,从而引发另一个saga,react-native,error-handling,redux,redux-saga,React Native,Error Handling,Redux,Redux Saga,假设我有一个传奇故事: 导出函数*initSignUp(操作){ 试一试{ 收益呼叫(注册、操作、注册详情) }捕捉(错误){ console.log('在initSignUp中被捕获',错误) 产生put({type:'SIGN\u-UP\u-FAIL',err,action}) } } 哪个是调用(调用?排队?)另一个: 导出功能*注册(操作){ 试一试{ let response=yield Auth.signUp({…}) 收益率put(addData({…})) }捕捉(错误){ c
导出函数*initSignUp(操作){
试一试{
收益呼叫(注册、操作、注册详情)
}捕捉(错误){
console.log('在initSignUp中被捕获',错误)
产生put({type:'SIGN\u-UP\u-FAIL',err,action})
}
}
哪个是调用(调用?排队?)另一个:
导出功能*注册(操作){
试一试{
let response=yield Auth.signUp({…})
收益率put(addData({…}))
}捕捉(错误){
console.log('在注册中被捕获',错误)
抛出新错误(err)
}
}
如果在yield Auth.signUp()
上这里的内部传奇失败,那么会命中第一个catch块,但是抛出错误会导致未捕获的异常
我尝试过抛出新错误(err)和返回承诺。拒绝(err)这两种方法,虽然后者失败得更为优雅,但我仍然从未遇到过“在initSignUp中捕获”这一行
为什么我不能在initSignUp()
中捕获此错误
编辑:
initSignUp的名称如下:
函数*onboardingSaga(){
交出全部([
takeEvery(初始注册,初始注册),
...
及报名:
函数*authSaga(){
全部产生([
takeEvery(注册,注册),
...
根传奇:
导出默认函数*rootSaga(){
交出全部([
OnboardingSaga(),
AuthSaga()
])
}
堆栈跟踪:
[14:04:16] uncaught at rootSaga, at rootSaga
at rootSaga
at takeEvery
at signUp
TypeError: Cannot read property 'username' of undefined
at signUp$ (blob:http://192.168.178.27:19001/d74267c7-c785-4744-a144-ed0c708da730:224959:89)
at tryCatch (blob:http://192.168.178.27:19001/d74267c7-c785-4744-a144-ed0c708da730:20888:19)
at Generator.invoke [as _invoke] (blob:http://192.168.178.27:19001/d74267c7-c785-4744-a144-ed0c708da730:21063:24)
at Generator.prototype.(anonymous function) [as next] (blob:http://192.168.178.27:19001/d74267c7-c785-4744-a144-ed0c708da730:20931:23)
at next (blob:http://192.168.178.27:19001/d74267c7-c785-4744-a144-ed0c708da730:149528:29)
at proc (blob:http://192.168.178.27:19001/d74267c7-c785-4744-a144-ed0c708da730:149503:5)
at runForkEffect (blob:http://192.168.178.27:19001/d74267c7-c785-4744-a144-ed0c708da730:149744:21)
at runEffect (blob:http://192.168.178.27:19001/d74267c7-c785-4744-a144-ed0c708da730:149629:770)
at next (blob:http://192.168.178.27:19001/d74267c7-c785-4744-a144-ed0c708da730:149532:11)
at currCb (blob:http://192.168.178.27:19001/d74267c7-c785-4744-a144-ed0c708da730:149606:9)
- node_modules\expo\build\logs\LogSerialization.js:145:14 in _captureConsoleStackTrace
- node_modules\expo\build\logs\LogSerialization.js:40:24 in Object.serializeLogDataAsync$
- ... 9 more stack frames from framework internals
你应使用:
Redux saga期望产生声明性的
你不能直接给出一个承诺(我想Auth.signUp会返回一个承诺),你应该用
call()
谢谢你的建议,但是在rootSaga、takeEvery、signUp中仍然没有得到的关注…
@edzillion我没有看到takeEvery()
在您的代码中,但它存在于此堆栈跟踪中。必须使用takeEvery()
从其他地方调用您的signUp()
saga。跟踪该takeEvery
并添加完整错误(使用堆栈跟踪)对于这个问题。好的,我已经添加了takeEvery
部分和完整的堆栈跟踪。我实际上认为我应该使用take
而不是takeEvery
,因为我们只希望一次发生一次注册。实际上,您在signUp()中有无法读取未定义的的属性“username”
当从takeEvery()调用它时。
。很抱歉,无法进一步帮助处理代码。
let response = yield call([Auth, signUp], {...})