首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >取消基于有效载荷而不是影响的可观测性

取消基于有效载荷而不是影响的可观测性
EN

Stack Overflow用户
提问于 2018-02-02 03:12:49
回答 2查看 972关注 0票数 6

我有一个服务,使http请求的后端,我不控制,以获得营销网页内容。有时,我需要同时加载多个营销内容。我可以创建一个调用服务的效果。

代码语言:javascript
复制
@Effect()
marketingContent$ = this.actions$
  .ofType(LOAD_MARKETING_CONTENT)
  .switchMap(({ payload }) => this.marketingService.getContent(payload)
    .map(content => Action.LoadMarketingContentComplete(content))
  )

这很好,我可以打电话给store.dispatch(Action.LoadMarketingContent('A'))

问题是,如果我需要一次加载多个营销内容,.switchMap将取消先前的请求。

代码语言:javascript
复制
store.dispatch(Action.LoadMarketingContent('A'));
store.dispatch(Action.LoadMarketingContent('B'));
// Only `'B'` is loaded since 'A' gets canceled before it completes

我可以使用.mergeMap而不是.switchMap,但是重复的请求不会被取消。

我也可以使用单独的动作来加载每个营销内容,但这需要为每一段创建一个动作和效果。

我是否可以使用.switchMap来取消对相同内容的请求(其中payload是相同的)?还是在同一流中取消重复请求的同时发出不同请求的另一种方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-02 03:24:02

如果你引入一个CANCEL_MARKETING_CONTENT动作,你可以用mergeMap做类似的事情

代码语言:javascript
复制
@Effect()
marketingContent$ = this.actions$
  .ofType(LOAD_MARKETING_CONTENT)
  .mergeMap(({ payload }) => this.marketingService
    .getContent(payload)
    .map(content => Action.LoadMarketingContentComplete(content))
    .takeUntil(this.actions$.ofType(CANCEL_MARKETING_CONTENT))
  );

基本上,这将允许您加载任意数量的营销内容,但是在分派CANCEL_MARKETING_CONTENT操作之前,应该由您通过发送一个LOAD_MARKETING_CONTENT操作来取消任何挂起的加载。

例如,要只加载部分A,您可以这样做:

代码语言:javascript
复制
store.dispatch(Action.CancelMarketingContent());
store.dispatch(Action.LoadMarketingContent('A'));

要加载AB这两个部分,您可以这样做:

代码语言:javascript
复制
store.dispatch(Action.CancelMarketingContent());
store.dispatch(Action.LoadMarketingContent('A'));
store.dispatch(Action.LoadMarketingContent('B'));

实际上,有一种类似的,但更整洁的方式,它不涉及使用另一个行动。

您可以使用与取消触发器相同的有效负载分派相同的操作。例如:

代码语言:javascript
复制
@Effect()
marketingContent$ = this.actions$
  .ofType(LOAD_MARKETING_CONTENT)
  .mergeMap(({ payload }) => this.marketingService
    .getContent(payload)
    .map(content => Action.LoadMarketingContentComplete(content))
    .takeUntil(this.actions$
      .ofType(LOAD_MARKETING_CONTENT)
      .skip(1)
      .filter(({ payload: next }) => next === payload)
    )
  );

从内存中,需要skip来跳过当前由效果处理的操作。答案假设payload"A""B"等等。

票数 8
EN

Stack Overflow用户

发布于 2018-02-02 17:17:35

与其具体取消该效果,您还可以更改该效果以在组中检索营销内容,并仍然利用switchMap来取消随后的请求。

代码语言:javascript
复制
@Effect()
marketingContent$ = this.actions$
  .ofType(LOAD_MARKETING_CONTENT)
  .switchMap(({ payload }) => forkJoin(
    payload.map(name => this.marketingService.getContent(payload))
  ).map(content => Action.LoadMarketingContentComplete(content))

在这种情况下,payload将是要检索的内容名称数组,而不是允许将内容作为组加载的单个名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48575161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档