dva models一些隱藏的騷操作
使用take操作進行事件監聽,用來命令 middleware 在 Store 上等待指定的 action。 在發起與 pattern 匹配的 action 之前,Generator 將暫停(eg:下一個請求的引數依賴前一個請求的結果)。
*fetchList({ payload, callback }, { call, put, select, take }) { yield put({ type: 'dict/xxxx', payload: { ... }, }); yield take('dict/xxxx/@@end'); const dictData = yield select(state => state.dict.dicts); const response = yield call(getList, { xxx: dictData.xxx ... }); }
race(effects)
任務的競爭,用來命令 middleware 在多個 Effect 間執行 競賽(Race)(與 Promise.race([…]) 的行為類似)。
*fetchList({ payload, callback }, { race }) { const { list, timeout } = yield race({ list: call(services.fetchList), timeout: call(delay, TIMEOUT), }); if (timeout) { throw new Error('timeout'); } }
任務的並行執行
把多個要並行執行的東西放在一個數組裡,就可以並行執行,等所有的都結束之後,進入下個環節,類似promise.all的操作。一般有一些整合介面,比如dashboard,其中各元件之間業務關聯較小,就可以用這種方式去分別載入資料,此時,整體載入時間只取決於時間最長的那個。
之前是yield []
, 後來 dva 升級了 saga 的版本之後就推薦用yield all([])
-
yield []
*fetchList({ payload, callback }, { }) { const [xx1_req, xx2_req, xx3_req] = yield [ call(xx1, payload), call(xx2, payload), call(xx3, payload), ] }
-
yield all([])
*fetchList({ payload, callback }, { all }) { const [xx1_req, xx2_req, xx3_req] = yield all([ call(xx1, payload), call(xx2, payload), call(xx3, payload), ]) }