2016-07-15 15 views
23

Tôi có một cửa hàng có danh sách các mặt hàng. Khi ứng dụng của tôi tải lần đầu tiên, tôi cần phải deserialize các mục, như trong việc tạo ra một số đối tượng trong bộ nhớ dựa trên các mục. Các mục được lưu trữ trong kho lưu trữ Redux của tôi và được xử lý bởi itemsReducer.getState trong redux-saga?

Tôi đang cố gắng sử dụng redux-saga để xử lý việc deserialization, như là một tác dụng phụ. Ngày tải trang đầu tiên, tôi gửi một hành động:

dispatch(deserializeItems()); 

saga tôi là thiết lập đơn giản:

function* deserialize(action) { 
    // How to getState here?? 
    yield put({ type: 'DESERISLIZE_COMPLETE' }); 
} 

function* mySaga() { 
    yield* takeEvery('DESERIALIZE', deserialize); 
} 

Trong saga deserialize của tôi, nơi tôi muốn để xử lý các tác dụng phụ của việc tạo ra các phiên bản trong bộ nhớ các mục của tôi, tôi cần đọc dữ liệu hiện có từ cửa hàng. Tôi không chắc chắn làm thế nào để làm điều đó ở đây, hoặc nếu đó là một mô hình tôi thậm chí nên cố gắng với redux-saga.

Trả lời

81

bạn có thể sử dụng select effect

import {select, ...} from 'redux-saga/effects' 

function* deserialize(action) { 
    const state = yield select(); 
    .... 
    yield put({ type: 'DESERISLIZE_COMPLETE' }); 
} 

bạn cũng có thể sử dụng nó với selectors

const getItems = state => state.items; 

function* deserialize(action) { 
    const items = yield select(getItems); 
    .... 
    yield put({ type: 'DESERISLIZE_COMPLETE' }); 
} 
0

Chọn hiệu ứng không giúp chúng ta nếu chúng ta trong một chức năng gọi lại, khi dòng mã không xử lý bởi Saga. Trong trường hợp này chỉ cần vượt qua dispatchgetState để saga root:

store.runSaga(rootSaga, store.dispatch, store.getState) 

Và đèo tham số để saga con

export default function* root(dispatch, getState) { yield all([ fork(loginFlow, dispatch, getState), ]) }

Và sau đó trong các phương pháp canh

export default function* watchSomething(dispatch, getState) ...

Các vấn đề liên quan