1

根据文档,在可观察对象中延迟操作非常简单:

const pingEpic = action$ =>
  action$.ofType('PING')
    .delay(1000) // Asynchronously wait 1000ms then continue
    .mapTo({ type: 'PONG' });

但是我想根据操作有效负载中的某些值来延迟操作。例如这样的事情(什么不起作用):

const pingEpic = action$ =>
  action$.ofType('PING')
    .delay(action => action.payload.delayTime) // Asynchronously wait the time defined within the action then continue
    .mapTo({ type: 'PONG' });

不幸的是.delay()只需要一个简单的静态值,我不知道如何从动作中设置值。有人知道吗?

为什么我需要它?

这种行为背后的原因是,我在我的史诗中调用了一个 REST API,它在后端创建了一个新项目。当这个调用返回时,我将触发两个动作(通过 flatMap)。一个成功的操作是让 reducer 更新相应的状态,第二个操作是获取后端中所有可用项目的列表。不幸的是,后端有点慢(我无法控制它),因此对所有项目的立即 get 调用会返回一个没有新创建项目的列表。500 毫秒后执行相同的调用会按预期返回任何内容。因为这个“获取整个列表请求”与第一次显示页面时完全相同,我不希望所有请求都有这种延迟,但只有在创建调用后触发它时才会出现这种延迟。

如果没有人能告诉我如何从动作中获得延迟,第二种可能性是使用不同的动作,让另一个史诗简单地听并使用某种硬编码的延迟,但如果我可以通过参数化它会很酷同样的动作。

4

1 回答 1

1

您可以使用 来执行此操作delayWhen,但它有点笨拙(它的工作原理类似于takeUntil):

const pingEpic = action$ => action$.ofType('PING')
  .delayWhen(({ payload: { delayTime }}) => Observable.timer(delayTime)) 
  .mapTo({ type: 'PONG' });

所以delayWhen延迟你的原始Observable,直到Observable回调函数返回的东西发出一些东西。然后它恢复 ORIGINAL Observable,所以如果你有一个map而不是一个mapTo之后,你可以映射到原来的动作/有效负载/任何东西。

于 2018-02-16T13:30:34.700 回答