Не удается отловить ошибки, вызванные вызовом redux-saga () в другой саге - PullRequest
0 голосов
/ 05 декабря 2018

Допустим, у меня есть одна сага:

export function * initSignUp (action) { try { yield call(signUp, action.signUpDetails) } catch (err) { console.log('caught in initSignUp', err) yield put({ type: 'SIGN_UP_FAIL', err, action }) } }

, которая вызывает (вызывает? Queuing?) Другую:

export function * signUp (action) { try { let response = yield Auth.signUp({...}) yield put(addData({...}))<br> } catch (err) { console.log('caught in signUp', err) throw new Error(err) } }

Если внутренняя сага здесь терпит неудачу на yield Auth.signUp(), тогда первый блок catch срабатывает, но выбрасывание ошибки приводит к неперехваченному исключению.

Я пробовал и throw new Error(err), и return Promise.reject(err), и, хотя последний терпит неудачу более изящно, я все равно никогда не нажимал на строку «поймано в initSignUp».

Почему я не могу catch эта ошибка в initSignUp()?

edit:

initSignUp вызывается так:

function * onboardingSaga () { yield all([ takeEvery(INIT_SIGN_UP, initSignUp), ...

и signUp:

function * authSaga () { yield all([<br> takeEvery(SIGN_UP, signUp), ...

rootSaga:

export default function * rootSaga () { yield all([ OnboardingSaga(), AuthSaga() ]) }

Stacktrace:

[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

1 Ответ

0 голосов
/ 05 декабря 2018

Вы должны использовать call():

let response = yield call([Auth, signUp], {...})

Redux-saga ожидает, что декларативные эффекты будут получены.

Вы можете 't напрямую дает обещание (я полагаю, Auth.signUp возвращает обещание), вы должны заключить его в call().

...