问题标签 [redux-saga]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
355 浏览

redux - 将 pubnub 与 redux-saga 一起使用的最佳实践是什么?

在 redux-saga 中使用生成器使用 pubnub 的最佳实践是什么。要在 Connect、断开连接、事件、检索历史消息等上调度操作?

问题是 PubNub 提供了一个回调 API 而不是 Promise,而且有些函数有多个回调,比如连接、断开连接。

对于具有此功能的发布:

订阅有这个:

0 投票
6 回答
14674 浏览

javascript - React/redux 应用程序在 Safari 上呈现空白屏幕

我在 React/redux 中构建了一个应用程序,它可以在我尝试过的每个浏览器中运行,但 MacOS 上的 Safari 和 iPhone 上的任何浏览器都可以。我没有收到任何错误,没有控制台消息,没有什么能给我一些想法。它只在 Safari 中呈现标签并且屏幕是空白的。

http://podcast.exploration.io

你知道我该如何追踪这个问题吗?

谢谢

0 投票
2 回答
7163 浏览

webpack - Redux Saga 热重载

我正在做一个 React & Redux 项目。该项目曾经使用 webpack-dev-middleware 和 hot middleware 进行热重载。

在我将 Redux Saga 添加到项目中,并将 saga 中间件添加到 redux store 之后。似乎每当我更改 saga 代码时,热重载都会中断并显示错误消息:

Provider> 不支持store即时更改。您很可能会看到此错误,因为您更新到 Redux 2.x 和 React Redux 2.x,它们不再自动热重载减速器。有关迁移说明,请参阅https://github.com/reactjs/react-redux/releases/tag/v2.0.0

我知道 Saga 使用生成器并且它是时间相关的。是否可以使用 Sagas 热重载页面?就像 Redux reducer 在热重载期间如何替换自己一样。

谢谢!

0 投票
6 回答
13799 浏览

javascript - Redux saga debounce 而不仅仅是延迟/取消

有没有办法在 Redux-Saga 中消除抖动,其中后续调用在相同的延迟之后排队,这会不断被添加到队列中的每个新任务碰撞。类似于 lodash 的去抖动https://lodash.com/docs#debounce

我目前有类似于 redux-saga 的 debounce 的东西,但删除了取消部分,因为我仍然想执行每个任务,我只想捆绑所有事件以便稍后在单个线程中触发。

我目前拥有的:

我尝试将 fork 分配给变量,然后检查它是否正在运行(.isRunning()),但不知道如何才能将那个 fork 再推迟一次。

0 投票
2 回答
907 浏览

javascript - 减少 redux-thunk 样板

在编写redux-thunk函数时,称为thunk,有很多样板文件可以很容易地抽象掉。例如,在我们的大多数异步 API 调用中,我们都在执行以下操作,而没有任何副作用:

简单的!尽管这涵盖了我们至少 70% 的请求,但我确信有一种优雅的方法可以将上述代码的分配抽象为类似这样的内容(伪代码):

当我们需要检查状态和其他副作用时,我们可以返回到适当的 thunk。虽然在大多数情况下......我们可以减少这个?

有什么优雅的想法吗?

0 投票
1 回答
1677 浏览

reactjs - Redux Saga 过早地停止了 LOCATION_CHANGE

所以我在路由加载时动态注入 Sagas

injectAsyncSagas像这样:

在哪里store.runSagasagaMiddleware.run在商店创建期间创建。

当路由加载时,saga 成功启动。它正在监听动作。

当我加载路线时,“Start mySagaFunction”得到了安慰。如果我派遣 SOME_HOME_PAGE_ACTION,它会成功完成它必须做的任何事情。当我离开页面时,反应路由器调用 LOCATION_CHANGE,Saga 控制台“停止 mySagaFunction”,暗示它成功退出了 while 循环。

然后我去另一条路线,然后回到这条路线。这次 LOCATION_CHANGE 由路由器分派,正如预期的那样。但 Saga 正在启动,然后立即停止。我的控制台是这样的:

在 Redux 开发工具中,我只看到一个 LOCATION_CHANGE。我如何弄清楚为什么 Saga 开始并立即停止?只有当我回到路线时才会发生这种情况。

我想也许 LOCATION_CHANGE 派送晚了。但不是。在我的减速器中,我安慰了动作类型。首先使用 LOCATION_CHANGE 调用 Reducer,然后 saga 开始,然后 saga 停止。

Link用来在页面之间导航。我也试过browserHistory.push(url)dispatch(push(url))。结果相同。

注意:我得到了从react-boilerplate注入 sagas 的代码。我只使用了这段代码,我没有使用样板本身。我运行了样板文件,但那里没有发生此错误。区别在于:

  • selectLocationState在 syncHistoryWithStore 中使用。我的整个商店都不是不可变的,所以我不需要它。
  • 它使用它自己的routeReducer而不是routerReducerfrom react-router-redux。我不知道为什么,可能是因为完整的不可变存储。

无论如何,在样板代码中,我删除了上述两点,但仍然没有发生这种情况。

0 投票
1 回答
197 浏览

javascript - React / Redux 加载具有副作用的数据

假设我有一个预订系统的存根。

创建预订时,我可以在我们的客户中搜索并选择我要预订的客户。选择客户后,关联的客户联系人将作为副作用加载。作为用户,我必须选择其中一个联系人进行预订。

让我们假设我的状态形状是这样的:

保存后,我只保存 customerId 和 customerContactId。

现在假设我想在未来的某个时间点编辑此预订。

我可以

1)获取我拥有的数据,并基本上“重播”动作以触发我需要的副作用(例如,设置客户并触发加载客户联系人的副作用)或

2)获取我拥有的数据,手动加载我需要的任何额外数据,然后一次性设置完整的应用程序状态。

您对最佳前进路线有何看法?这是一个简化的例子,假设现实世界的场景至少有 2-4 个额外的副作用需要触发。

0 投票
3 回答
24998 浏览

javascript - 使用 redux-saga 调度操作时取消 saga

当一个 START 动作被调度时,我为一个秒表 React 组件启动一个计时器:

STOP当从我的组件分派操作时,我无法停止传奇。我尝试过在我的工人传奇中使用cancel和效果:cancelled

以及第一个代码块中的方法,我尝试从观看服务中停止传奇。

0 投票
1 回答
2614 浏览

javascript - 在匿名函数回调中使用 put

我正在将Pusher实现到我的 React+Redux Saga 应用程序中,但是我遇到了一些无法访问put(...)方法的回调问题。在方法中使用console.log(...)etc. 确实显示,但我无法put了解我的应用程序的状态。

我在异步/生成器函数的一些实现上可能是错误的,但我现在几乎被卡住了。

我的代码来说明什么不会触发:

基于@Sebastien 的解决方案

0 投票
0 回答
291 浏览

sockets - Redux-saga 和 socket 订阅导致 Uncaught TypeError: Converting circular structure to JSON

在我的聊天应用程序中使用 redux-saga 生成器时,我无法订阅 socketcluster ( http://socketcluster.io/ ) 频道。socketcluster 后端的设置方式是,任何消息都保存在数据库中,然后发布到接收用户的个人频道,该频道以用户的 id 命名。例如,用户 A 的 id 为“123abc”,并会订阅名为“123abc”的频道以获取他们的实时消息。

下面的代码确实接收到发布到通道的新消息,但它在加载时抛出“TypeError:将循环结构转换为 JSON”,并破坏了我在应用程序中的所有其他 redux-saga 生成器。我已经完成了 Chrome Devtools 的挖掘,我的理论是它与 createChannel 函数中创建的队列有关。此外,我尝试在 subscribeToChannel 函数中返回延迟承诺,但这也导致了循环转换错误,我可以根据要求发布该代码。

我首先提到了这个答案:https ://stackoverflow.com/a/35288877/5068616它帮助我获得了以下代码,但我在互联网上找不到任何类似的问题。还有一点需要注意的是,我正在使用 redux-socket-cluster ( https://github.com/mattkrick/redux-socket-cluster ) 来同步套接字和状态,但我不认为它是问题

sagas.js

谢谢您的帮助!