dva api之take、put、select、all
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 }); }, } })