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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM