Bắt Lỗi Trong Redux-Saga


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:

  1. 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
      }
    }
    
  2. 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
      }
    }
  3. 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

Rate this post

You May Also Like

About the Author: truongluu

Leave a Reply

Your email address will not be published. Required fields are marked *