Khi sử dụng redux-saga thì cơ chế bắt lỗi của nó thông qua khối try catch ở hàm cha và được chia làm 3 loại:
- Khi hàm cha có gọi nhiều effect hoặc hàm con block (call effect) thì lỗi được ném ra khi phần mã trong thân hàm cha hoặc 1 trong bất kì hàm con nào phát sinh lỗi. Lúc nãy lỗi được ném vào catch của hàm cha và những hàm con đang đợi xử lý sẽ được kết thúc hết.
function* fetchResource(resource) { const {data} = yield call(api.fetch, resource) yield put(receiveData(data)) } function* fetchAll() { yield all([ call(fetchResource, 'users'), call(fetchResource, 'comments'), call(delay, 1000) ]) } function* main() { try { yield call(fetchAll) } catch (e) { // handle fetchAll errors } }
- Khi hàm cha gọi đến nhiều hàm con với effect non-block fork thì lỗi được ném ra khi hàm cha bị lỗi hoặc 1 trong bất kỳ hàm con bị lỗi. Hàm con nào đang đợi xử lý cũng bị hủy.
//... imports function* fetchAll() { const task1 = yield fork(fetchResource, 'users') const task2 = yield fork(fetchResource, 'comments') yield call(delay, 1000) } function* fetchResource(resource) { const {data} = yield call(api.fetch, resource) yield put(receiveData(data)) } function* main() { try { yield call(fetchAll) } catch (e) { // handle fetchAll errors } }
- Trường hợp còn lại hàm con là spawn effect thì lỗi được bắt khi thân hàm cha phát sinh lỗi hoặc bất kì hàm con nào bị lỗi hàm cha bắt lỗi và kết thúc. Những hàm con đang pending vẫn thực thi tiếp.
Link sanbox: https://codesandbox.io/s/oz81kv3oy
Xem thêm: Error propagation