реакции / редуксы / саги - как связать действия на основе существующих данных магазина? - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь инициировать действия внутри саги, основываясь на том, содержит ли состояние данные или нет.

Поскольку у меня уже есть саги для получения данных из книг / игр, я хочу повторно использовать эту функциональность. И я хочу запускать их только в том случае, если в хранилище нет этих данных.

Пока это мой код ...

function* getAllSaga(action) {
    try {

        let books = yield select(Selectors.books);
        let games = yield select(Selectors.games);

        if(!books.length || !games.length){
            yield put({ type: 'GET_BOOKS' });
            yield put({ type: 'GET_GAMES' });
        }

        books = yield select(Selectors.books);
        games = yield select(Selectors.games);

        const concated = books.concat(games);

        yield put({ type: 'GET_ALL_SUCCEEDED', all: concated });

    } catch (err) {
        yield put({ type: 'GET_ALL_FAILED', message: err.message });
    }
}

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 03 мая 2018

put s не являются блокирующими, поэтому вам нужно изменить код так, чтобы он ожидал новых данных, например:

function* getAllSaga(action) {
    try {

        let books = yield select(Selectors.books);
        let games = yield select(Selectors.games);

        if(!books.length || !games.length){
            yield put({ type: 'GET_BOOKS' });
            yield put({ type: 'GET_GAMES' });
            yield all([
                take('GET_BOOKS_SUCCEEDED'),
                take('GET_GAMES_SUCCEEDED')
            ])
            books = yield select(Selectors.books);
            games = yield select(Selectors.games);
        }

        const concated = books.concat(games);

        yield put({ type: 'GET_ALL_SUCCEEDED', all: concated });

    } catch (err) {
        yield put({ type: 'GET_ALL_FAILED', message: err.message });
    }
}
...