Как объединить несколько вызовов Redux Saga - PullRequest
0 голосов
/ 25 апреля 2019

Как мне объединить 2 сага-звонка, которые мне нужно использовать отдельно на других страницах?

Я пробовал несколько вещей (выдать все и т. Д.), Основываясь на других ответах SO, но я не могу выполнитьжелаемый результат.

У меня есть сага, показанная ниже, и мое приложение в основном работает нормально.На отдельной странице Коллекции и Коллекции у меня нет проблем.Тем не менее, у меня есть страница, которая представляет собой сочетание коллекций и коллекции.После того, как коллекции возвращены, мой Saga устанавливает setLoader в значение false, ДО того, как второй вызов saga возвращает результаты для Collection, что означает, что мой загрузчик не работает правильно.

Я уверен, что мог бы добавить еще одну утку / промежуточное ПО для GET_BOTH, * loadBoth могбудет сделано, но я хочу избежать этого.

Любые предложения будут высоко оценены.Спасибо.

import { fork, call, put, take } from "redux-saga/effects";
import { setLoader } from "../ducks/loader";
import { types as collectionsTypes, actions as collectionsActions } from "../ducks/collections";
import { types as collectionTypes, actions as collectionActions } from "../ducks/collection";
import { 
    getCollectionsApiRequest,
    getCollectionApiRequest
} from "../services/api";

export function* loadInitialCollections(query = "") {
    try {
        yield put(setLoader(true));
        const collectionsResult = yield call(getCollectionsApiRequest, query);

        yield put(collectionsActions.getCollectionsSuccess({
            collections: collectionsResult.data,
            feature: collectionsTypes.COLLECTIONS
        }));
        yield put(setLoader(false));

    } catch(e) {
        console.log(e);
    }
}

export function* loadInitialCollection(query = "") {
    try {
        yield put(setLoader(true));
        const collectionResult = yield call(getCollectionApiRequest, query);

        yield put(collectionActions.getCollectionSuccess({
            collection: collectionResult.data,
            feature: collectionTypes.COLLECTION
        }));
        yield put(setLoader(false));

    } catch(e) {
        console.log(e);
    }
}


export function* watchGetCollectionsRequest() {
    while(true) {
        const { query } = yield take(collectionsTypes.GET_COLLECTIONS);
        yield fork(loadInitialCollections, query);
    }
}

export function* watchGetCollectionRequest() {
    while(true) {
        const { query } = yield take(collectionTypes.GET_COLLECTION);
        yield fork(loadInitialCollection, query);
    }
}

const salesSaga = [
    fork(watchGetCollectionsRequest),
    fork(watchGetCollectionRequest)
];

export default salesSaga;

1 Ответ

0 голосов
/ 26 апреля 2019

Вместо выполнения put для действия collectionActions.getCollectionSuccess, вы можете вызвать saga, что решается действием, напрямую, используя call, спасибо, что он будет ждать, пока единица саги getCollectionSuccess будет завершена.

...