本问题选自Stack overflow中llja提出的一个问题,由于本人翻译水平有限,所以有些不明白的地方,可以直接访问这个问题的网址,原地址
有涉及到侵权的问题,请告知我,我会第一时间删除本篇文章,本人的邮箱:aleenli1992@gmail.com
原问题:
如何使用setTimeout去调用Redux的action
我有个更新我的APP通知状态的动作。通常通知的种类是一个错误或者信息。我需要五秒后发送一个动作,之后通知状态返回最初的样式,但是没有通知。最主要的实现是提供一个功能,一个可以在5秒之后通知自动消失的功能。
在使用setTimeout的时候,正在返回其他动作但是无法找到谁在线上完成了。所以希望大家给点建议。
原答案:
不要掉进一个库应该能够作任何事情的陷阱里,如果你想在JS中使用一个计时器,你就需要使用setTimeout。没什么理由证明Redux和其他库的不一样。
Redux确实提供了一些解决异步操作的替用方法,但是你只能用在当你意识到你复制了太多代码的时候。除非你有这个问题,使用自带的语言是最简单的解决方案。
在线写异步代码
只是迄今为止最简单的方法,并且没什么特别的Redux代码。
|
|
同样,一个连接组件的内部:
|
|
这个连接组件的唯一区别是你通常无法访问储存本身,而是将任意一种dispatch()
或者特定的操作创建者去引入为props,无论怎样,这对与我们没有任何区别。
如果你不喜欢当你想在不同的组件完成相同的操作时有错误的话,你可能需要将操作的组件提取出来,而不是将需要调遣的对象写在函数中:
|
|
现在组件就可以使用showNotficationWithTimeout
,而不用复制这个逻辑或者有不同的通知在这个时间轴上。
|
|
为什么showNotificationWithTimeout
接受dispath
作为第一个参数呢?这是因为他需要通过dispatch的操作去储存。通常一个组件有一个入口去dispatch
,但是如果我们想要外部函数来去控制这个dispatch,我们就需要对这个dispatch进行控制。
如果你的一些模块有一个独立的储存空间,你只要进入它并且直接替代dispatch
:
|
|
这样看起来比较简洁但是我们们并不推荐这样的处理。主要原因是我们不喜欢这个,因为它被迫的是储存区域变成了一个独立区。因为这样使得sever rendeing执行起来非常困难。在服务器中,你希望每个请求都有自己的储存区,从而使不同的用户获得不同的预加载数据。
一个独立的储存区也让测试变得困难。你不能长时间的去mock一个储存区当你测试运行的时候,因为他们在一个特定的模块中应用了特定的真是储存区。你不能每一次都从外部调整它的state。
虽然在技术上你可以从一个模块中提取出一个独立的储存区,但是我们很失望。不要这样做,除非你确定你的app将永远不会添加服务器的rendering。
回到先前这个版本:
这样解决了问题,在时间轴上既符合逻辑也保存了我们需要的数据。
Thunk Middleware
一个简单的app,交互应该足够。如果你乐意使用middleware就不要担心它。
大多数的app,无论如何,你都会发现有很多不足之处。
举一个例子,我们需要通过dispatch
时,他看起来很悲催。