【发布时间】:2020-11-09 18:56:55
【问题描述】:
这是使用 ReactJS、Redux 和 Redux-thunk。
reducer/get-data.js里面,我可以设置一个
let dataFetchingStartTimestamp;
在全球范围内?我想在全局范围内设置它的原因是函数getData() 以块的形式获取数据,所以第一次,假设它获取前 300 条记录(假设 300 条记录可能需要 10 秒),并且第二次,另外 300 条记录,依此类推,直到达到 6000 条记录。 getData() 将在 AJAX 成功后调用自己。 (promise 的 then 处理程序)。
当用户更改 UI Dropbox 时,现有的 getData() 循环应该停止并使用新值重新启动,并且之前发生的 AJAX 不应该将数据置于 Redux 状态。所以这就是为什么当我们有dataFetchingStartTimestamp时,我们可以设置它,当它是第一次获取数据时,将dataFetchingStartTimestamp设置为Date.now(),然后如果用户更改UI,那么它将是另一个“第一次获取数据”,因此会更改dataFetchingStartTimestamp。所以在这个函数内部或者reducer里面,如果它看到dataFetchingStartTimestamp和之前的值不一样,那么它什么也不做。这意味着,只会执行具有最新dataFetchingStartTimestamp 的操作。
我想传递这个值的方式是当getData()在初始AJAX之后调用自己,将dataFetchingStartTimestamp传递给自己,就像dataFetchingContinuationTimestamp一样,所以这个循环会有一个dataFetchingContinuationTimestamp的值到与全球 dataFetchingStartTimestamp 比较。
reducer 是如何得到这个值的:它会在第一次时,getData() 为 redux 状态调度一个GET_DATA_START 和dataFetchingStartTimestamp 的有效负载。所以在reducer中,case后面的语句可以检查当前全局dataFetchingStartTimestamp是否和Redux状态下的一样。如果它们不同,则根本不要更改状态。
这可以做到吗,或者真的有更好的方法来处理它?我们也可以使用
const dataFetchingStartTimestamp = { value: null };
如果我们只允许设置一个常量,但value 将作为全局值。
另一种方法是使dataFetchingStartTimestamp 成为getData(函数对象)的属性。
也许 dataFetchingStartTimestamp 这里所谓的 global 并不是真正的全局,而是 webpack 打包的作用域的局部变量,或者作为模块内的局部变量?
【问题讨论】:
-
Reducer 是纯函数,所以我想这不是最好的主意...
-
但是纯函数不能检查状态并采取相应措施吗?例如,即使
value: state.value + 1或value: state.value % 2 ? "hello" : "world"也在使用之前的状态 -
一目了然地解决您的问题,请求取消对您不起作用吗?
-
请求取消——你的意思是AJAX取消?循环(函数)为 300 条记录生成 1 个 AJAX,当 AJAX 完成时,它会调用自己......所以我想如果 AJAX 可以及时取消,它应该可以工作。但是,如果用户更改下拉框会创建一个事件,并且 AJAX 处理也有一个事件,并且 BOTH 处理程序在同一个事件周期中执行。我认为在reducer中,如果取消AJAX,则会处理有关先前AJAX返回数据的情况......所以我认为唯一的问题是如果两个事件都在同一个事件周期中怎么办......
-
@Patrickkx 顺便说一句,如果reducer 将AJAX 返回的数据设置为状态,那也算是纯函数吗?服务器可以返回任何它想要的东西,所以
f(1)可以根据服务器返回1或3,所以它不是一个纯函数
标签: reactjs redux redux-thunk