react / redux / sagas - 如何基于现有商店数据链接动作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了react / redux / sagas - 如何基于现有商店数据链接动作?相关的知识,希望对你有一定的参考价值。

我试图根据状态是否包含数据来触发传奇内部的操作。

由于我已经有了从书籍/游戏中获取数据的传闻,我想重用该功能。如果商店没有那些数据,我只想解雇那些。

到目前为止这是我的代码......

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 });
    }
}

我该怎么解决这个问题?

答案

puts是非阻塞的,因此您需要修改代码,以便等待新数据,如下所示:

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 });
    }
}

以上是关于react / redux / sagas - 如何基于现有商店数据链接动作?的主要内容,如果未能解决你的问题,请参考以下文章

react redux Reduc-saga实现 take put takeEvery createSagaMiddleware等

React 通用 redux-saga 内存泄漏

从 redux-saga 函数访问 React 上下文值

访问 saga 中的 store.dispatch 以与 react router redux 一起使用

使用 React/Redux saga 将数据从组件传递到 action 和 saga

electron+react-redux-saga基础项目配置