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