take: 監聽一個事件是否完成.
put: 發起一個action
select: 獲取當前namespace的state
all: 類似Promise.all
yield put一個reducers時,是一個同步操作,put結束后可以立即獲取state里的數據
yield put一個effects時,是一個異步操作,不能立即獲取state里的數據,需要使用take監聽effcts完成,例如
take('success/@@end');
const { aomount } = yield select();
當需要監聽多個effects完成時
yield all([take('s1/@@end'), take('s2/@@end')]); // 等待s1、s2兩個都完成 yield take(['s1/@@end', 's2/@@end']); // 等待s1、s2任意一個完成
完整示例
app.model({ namespace: 'app', state: { amount: 0 }, reducers: { add(state, { payload }) { const { amount } = state; return { ...state, amount: amount + payload } } }, effects: { *test(_, { put, all, take, select }) { yield put({ type: 'add1', payload: 1 }); yield put({ type: 'add2', payload: 10 }); yield all([take('add1/@@end'), take('add2/@@end')]); const { amount } = yield select(); // 此時amount的值為11 }, *add1({ payload }, { put, call }) { yield call(delay, 2000); // delay是一個延時庫 yield put({ type: 'add', payload }); }, *add2({ payload }, { put, call }) { yield call(delay, 4000); yield put({ type: 'add', payload }); }, } })