如何在 next.js 中渲染之前等待复杂的 redux-saga 操作流程完成?

2023-12-22

我在等待“一个操作流程”从开始到结束完成时遇到问题。该应用程序在客户端中照常工作,但在服务器端执行操作时它直到最后才完成。

为了澄清这一点,我正确地使用了“next-redux-wrapper”和“next-redux-saga”,因为当我使用更简单的 sagas 流程时,我可以实现延迟渲染。

我认为错误主要在于我如何理解(或不理解)传奇效应。

为了简洁起见,省略了一些代码。

api.saga.js

const makeRequest = ({ body, url, method }) =>
  axios({ method, url: url, data: body });


export function* requestWatcher(action) {
  const { feature } = action.meta;

  try {
    const { data: response } = yield call(makeRequest, action.meta);
    yield put(apiSuccess({ response, feature }));
  } catch (error) {
    yield put(apiError({ error: error, feature }));
  }
}

export default function* apiSaga() {
  yield takeEvery(action => action.type.includes(API_REQUEST), requestWatcher);
}

SmallBusiness.saga.js

function* watchApiSuccess(action) {
  yield put(
    setPositions({ positions: action.payload.positions })
  );
  yield put(setLoader({ isLoading: false, feature: SMALL_BUSINESS }));
}

function* watchApiError() {
  yield put(setLoader({ isLoading: false, feature: SMALL_BUSINESS }));
}

function* watchFetchPositions() {
  yield put(
    apiRequest({
      body: null,
      method: 'GET',
      url: SMALL_BUSINESS_URL,
      feature: SMALL_BUSINESS
    })
  );
  yield put(setLoader({ isLoading: true, feature: SMALL_BUSINESS }));
}

export default function* smallBusinessSaga() {
  yield all([
    takeLatest(`${SMALL_BUSINESS} ${API_SUCCESS}`, watchApiSuccess),
    takeLatest(`${SMALL_BUSINESS} ${API_ERROR}`, watchApiError),
    takeLatest(FETCH_POSITIONS, watchFetchPositions)
  ]);
}

rootSaga.js

export default function* rootSaga() {
  yield all([call(smallBusinessSaga), call(apiSaga)]);
}

配置Store.js

store.sagaTask = sagaMiddleware.run(rootSaga);

客户端函数“watchApiSuccess”被调用,但服务器端则没有。除已经提到的函数外,每个生成器函数都在服务器端调用。

当我使用下面的代码示例简化流程时,应用程序将在服务器端预渲染。

function* watchPrefetchPositions() {
  const meta = {
    body: null,
    method: 'GET',
    url: SMALL_BUSINESS_URL,
    feature: SMALL_BUSINESS
  };

  const { data: response } = yield call(makeRequest, meta);
  yield put(setPositions({ positions: response.positions }));
}

export default function* smallBusinessSaga() {
  yield all([
    ...
    takeLatest(PRE_FETCH_POSITIONS, watchPrefetchPositions)
  ]);
}

我无法拥有复杂流程的主要问题是传奇无法执行标准化等操作。


您可以使用标志来控制组件何时以及是否应该渲染。这是渲染后备 UI(例如:旋转器或文本)的常见解决方案,以便等待异步进程(saga、thunk、API 服务等)完成并且组件拥有渲染自身所需的所有内容。

我在这里附上了一个 CodeSandBox 示例,以便您可以一目了然地了解它是如何工作的。https://codesandbox.io/embed/2586j3k1p https://codesandbox.io/embed/2586j3k1p

您可以看到加载出现了一会儿,直到获取数据。请注意,CodeSandBox 正在缓存此 API 调用,因此您在第一次单击后几乎不会注意到加载文本)。

React 路线图包括一个名为“Suspense”的处理异步渲染功能的版本,它模仿了与您所描述的这种特定类型的流程问题相同的行为。在 React 异步渲染发布之前,我建议使用标志。

如果您想了解更多详情,建议您观看

祝你好运

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 next.js 中渲染之前等待复杂的 redux-saga 操作流程完成? 的相关文章

随机推荐

  • pip安装成功但Python提示找不到模块

    我正在尝试使用 pip 安装软件包 安装成功 但是当尝试导入子包中的模块时 它显示一条错误消息 内容为 ModuleNotFoundError 没有名为 的模块 包的结构如下 Gestor Clientes v2 许可证 txt manag
  • 使用 CMake、C++ 和 Visual Studio 2012 进行分析

    我正在使用 CMake 2 8 10 1 生成 Visual Studio 2012 Ultimate 64 位 的项目文件 生成的解决方案包含一个库 一些测试和一些可执行文件 我想介绍一些应用程序 当我选择 分析 gt 开始性能分析 时
  • 如何确定 C 语言应用程序的内存大小?

    我想为我的应用程序分配固定内存 使用 C 开发 假设我的应用程序不应超过 64MB 的内存占用 而且我应该避免使用更多的 CPU 使用率 怎么可能呢 问候 马塞尔 在unix下 ulimit d 64M
  • R.java 中的参考不是最终版本

    生成样式属性的引用时 R java 文件的生成似乎出现了问题 人们期望该字段的声明是final但事实并非如此 怎么会 资源 值 attrs xml
  • 使用 Java 在 Android 上解密 OpenSSL 加密的文件

    我目前正在尝试在我的 Android 应用程序上实现文件解密 该文件将使用类似以下内容在主机 Linux 上加密 openssl aes 128 ecb salt k HASH in somefile in out somefile ope
  • 如何在iOS模拟器上启动appium测试?

    我有以下设置并尝试开始测试iOS Simulator 我是初学者 不知道如何开始测试 我已经导入并安装了appium来自教程 问题是 这个设置正确吗 如何运行测试 import java io File import java net UR
  • 如何从networkx中的图中删除float('nan')节点?

    我有一个数据集 泡菜格式 包含float nan 我需要将其删除 可以添加float nan 到图作为 networkx 中的节点 但是 我不知道如何删除它 import networkx as nx G nx Graph G add no
  • Git:未找到 Heroku 存储库或对象:

    这是 Heroku master push 命令的错误消息 Git LFS 0 of 5 files 0 B 167 50 MB batch response Repository or object not found https git
  • git 何时为 git config 命令引入了“--local”开关?

    git 版本变成了git config local可用选项 我在哪里可以阅读更多相关信息 我以为不提供 global将自动假设它是本地配置变量 为什么需要这个新选项 由于 git 源代码是在 git 中维护的 因此我们可以找到引入了 loc
  • 如何使用 nginx 设置 Referrer 策略

    我的 CMS https 和图像服务器 http 是分开的 我已经设置了图像服务器 以便它只能服务于白名单引用页面 现在我的问题是如何允许 CMS 服务器将响应标头发送到图像服务器以便 CMS 可以显示图像 我发现在 html 中给出这个
  • 读取 BIOS 级汇编中的输入? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在创建一个非常低级的应用程序 并且我已准备好引导加载程序 我本质上必须重建 scanf 函数 因为
  • 如何为 Visual Studio C++ 设置单元测试

    我无法弄清楚如何设置测试框架并使其可用视觉工作室2008 for C 大概是使用内置的单元测试套件 任何链接或教程将不胜感激 这一页 http gamesfromwithin com exploring the c unit testing
  • 具有多个不同图标的很棒的字体类

    我想创建带有多个图标的自定义 font awesome 类 即 2star 等级由 2 颗星和 3 颗空星组成 并排成一条线 彼此相邻 有没有办法在 CSS 中做到这一点 或者我必须使用具有多个 i class 的纯 html 解决方案 是
  • 从 FedEx 获取 OAuth 令牌以用于 Track API

    我正在尝试获取 OAuth 令牌来获得对某些 FedEx API 的授权访问权限 例如用于跟踪货件的 Track API 但我得到了401 NOT AUTHORIZED ERROR gt The given client credentia
  • 如何获取最后一个之前的元素?

    在量角器中 有 first and last 可用的方法ElementArrayFinder var elements element all by css myclass elements last elements first 但是 如
  • 比较两组字符串,返回不同的结果[重复]

    这个问题在这里已经有答案了 我运行这个command https i stack imgur com fojMC png在Python控制台中 为什么2个结果不同 gt gt gt S1 HelloWorld gt gt gt S2 Hel
  • 作为函数参数传递时如何停止评估 lisp 形式?

    我正在学习 Lisp 现在我正在尝试创建一个函数 该函数采用一些有效的 Lisp 形式作为参数 并返回一个在调用时执行 Lisp 形式的函数 例如 defun fn name action setf symbol function name
  • 点击按钮执行sql查询

    nw check php
  • 如何对 ngControl 用 @Self 修饰的反应式组件进行单元测试

    我通过注入 NgControl 编写了一个反应式组件 并使用 Self 装饰器进行装饰 我的问题与此类组件的单元测试有关 请看下面的代码 免责声明 我很快复制了代码并进行了一些内联更改 因此 这可能不是编译器满意的代码 我的反应组件 Com
  • 如何在 next.js 中渲染之前等待复杂的 redux-saga 操作流程完成?

    我在等待 一个操作流程 从开始到结束完成时遇到问题 该应用程序在客户端中照常工作 但在服务器端执行操作时它直到最后才完成 为了澄清这一点 我正确地使用了 next redux wrapper 和 next redux saga 因为当我使用