首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Redux:在做其他事情之前等待状态更改

Redux:在做其他事情之前等待状态更改
EN

Stack Overflow用户
提问于 2018-08-27 17:15:23
回答 2查看 3.6K关注 0票数 0

在一个假设的应用程序中,用户可以创建一本书,默认情况下这本书有3页。一旦增加了书和页,我想对书和页做一些其他的事情。在我的redux存储中,书籍和页面是两个独立的减缩器,在我的数据库中也是两个表。我现在的流程是:

  1. 用户创建新书。
  2. ADD_BOOK_REQUEST操作称为
  3. ADD_PAGES_REQUEST操作称为
  4. 将图书添加到激发ADD_BOOK_SUCCESS的数据库中
  5. 页面被添加到触发ADD_PAGES_SUCCESS的数据库中。

正如上面提到的,在执行步骤4和步骤5之后,我想用这本书做一些其他的事情,但我不确定这方面的最佳方法。为了让它现在运行,目前我有一个setTimeout函数,它运行检查新书和3页的bookId。如果书和3页在商店,做其他的事情,如果没有,再次运行超时。我觉得这不是最好的办法。*微笑:

EN

回答 2

Stack Overflow用户

发布于 2018-08-27 17:33:14

Gosha在他的文章用Redux-Saga检测状态变化中描述了一个可能的解决方案。

在那篇文章中,他建议编写一个waitFor函数,在提供的选择器最终返回true时返回该函数。

代码语言:javascript
运行
复制
function* waitFor(selector) {
  if (yield select(selector)) return; // (1)

  while (true) {
    yield take('*'); // (1a)
    if (yield select(selector)) return; // (1b)
  }
}

它可以这样使用:

代码语言:javascript
运行
复制
function* someSaga() {
  yield call(waitFor, state => getCurrentUser(state) != null);
  // the user is logged in by now
}

另一个可能的解决方案是一个更简单的自定义中间件,它在动作分派后进行检查。

票数 7
EN

Stack Overflow用户

发布于 2018-08-27 17:38:40

你有几个选择。

1)在您的React组件中,您可以连接到还原器在ADD_PAGES_SUCCESS时更新的状态。在componentWillReceiveProps中,您可以检查连接的状态,并在步骤(5)之后从组件中分派要执行的操作。

...not很好,因为componentWillReceiveProps可以快速获得毛茸茸,并且在可能的情况下应该避免。

2)使用redux-thunk或redux-saga:

使用Redux-saga,在您的操作处理程序(Saga)中,您可以对服务器响应执行take操作,并执行诸如有条件地进行API调用和yield (等待)之类的操作,此时您可以触发(put)更多的操作,或者进行更多的API调用,或者做任何您想做的事情。这不会取代你的减速器,也不会改变你的还原状态。

示例:

代码语言:javascript
运行
复制
// worker Saga: will be fired on ADD_PAGES_SUCCESS actions

function* doStuffAfterAddPages(action) {
  while (true) {
    yield take(ADD_PAGES_SUCCESS);

    try {
      let moreData;
      const result = yield call(api.doSomethingElse);

      if (result.isExpected) {
        moreData = yield call(api.doOtherStuff);
      } else {
        moreData = yield call(api.doOtherStuff);
      }

      yield put(OTHER_STUFF_COMPLETE, { data: moreData });
    } catch (error) {
      yield put(OTHER_STUFF_FAILED, { error: error.message);
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52044079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档