鍍金池/ 問(wèn)答/HTML/ 關(guān)于 dva 2 的一個(gè)使用的問(wèn)題(effects 調(diào)用)

關(guān)于 dva 2 的一個(gè)使用的問(wèn)題(effects 調(diào)用)

我想問(wèn)一個(gè)有關(guān) dva2 的一個(gè)問(wèn)題:

這里以官方提供的user-dashboard的代碼為例( https://github.com/dvajs/dva/... )

其effects:

    *create({ payload: values }, { call, put }) {
      yield call(usersService.create, values);
      yield put({ type: 'reload' });
    },
    *reload(action, { put, select }) {
      console.log('The reload is called...')
      const page = yield select(state => state.users.page);
      yield put({ type: 'fetch', payload: { page } });
    },

這里 create 函數(shù)會(huì)觸發(fā)一個(gè) { type: 'reload' } 這樣的 action,經(jīng)過(guò)嘗試會(huì)觸發(fā)下面的 reload 同名函數(shù)

但這個(gè)是如何導(dǎo)致 下面的 reload 函數(shù)執(zhí)行的呢?

看到源碼使用的 put 函數(shù):

function put(action) {
    const { type } = action;
    assertAction(type, 'sagaEffects.put');
    return sagaEffects.put({ ...action, type: prefixType(type, model) });
}

應(yīng)該主要也是 redux-saga 提供的,根據(jù)我的理解這里派發(fā)的 action 應(yīng)該和其他的 effects 沒(méi)有直接的調(diào)用關(guān)系(雖然dva增加了middleware使其返回Promise),比較困惑下面的 reload 是在哪里進(jìn)行觸發(fā)的?這個(gè)處理流程是如何的?

希望了解的同學(xué)能夠指點(diǎn)一二,非常感謝

回答
編輯回答
凝雅

想了解更多,請(qǐng)學(xué)習(xí)react-redux

2017年4月13日 07:00
編輯回答
安淺陌

感覺(jué)這就是 saga 本身的一種功能,我們使用 saga 的 takeEvery(key, sagaWithOnEffect); 對(duì)在業(yè)務(wù)組件中 dispatch 的 action 進(jìn)行監(jiān)聽(tīng),實(shí)際上和監(jiān)聽(tīng)這里的 action 是一樣的

2017年9月13日 23:17