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 }); 
    }, 
  } 
})

 

posted @ 2022-04-08 09:30  太阳叔叔  阅读(2203)  评论(1编辑  收藏  举报