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

react/redux/sagas-如何基于现有门店数据链接操作?,redux,redux-saga,Redux,Redux Saga,我正试图在一个传奇故事中根据州政府是否包含数据发起行动 因为我已经有了从书籍/游戏中获取数据的传说,所以我想重用该功能。我只想在存储区没有这些数据的情况下解雇它们 这是我到目前为止的代码 function* getAllSaga(action) { try { let books = yield select(Selectors.books); let games = yield select(Selectors.games); if(

我正试图在一个传奇故事中根据州政府是否包含数据发起行动

因为我已经有了从书籍/游戏中获取数据的传说,所以我想重用该功能。我只想在存储区没有这些数据的情况下解雇它们

这是我到目前为止的代码

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

如何解决此问题?

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

谢谢,但是什么是
take('BOOKS\u LOADED')
?这是从哪里来的?你说我已经有了从书籍/游戏中获取数据的传说。我假设这些是在您发送GET_BOOKS/GET_GAMES操作时运行的。一旦这些传奇中的获取逻辑完成,您将使用一些操作将返回的数据存储到state。我叫他们书装的/游戏装的。但是,请使用您使用的任何名称。我已经成功地获得了
GET\u BOOKS\u
,但这没有任何作用,真正获得这些书的是
GET\u BOOKS
。。。如果我使用
take('GET\u BOOKS\u successed')
什么都没有发生,它似乎根本没有通过
yield all([…])
。我可以看到
GET\u BOOKS\u successed
在记录器中被触发。我发现了
take('GET\u BOOKS\u successed')
不起作用,因为它的顺序不正确。以下操作有效:`yield all([yield put({type:'GET_GAMES'})、yield take('GET_GAMES_successed')、yield put({type:'GET_BOOKS'})、yield take('GET_BOOKS_successed')、]))`