【问题标题】:Interrupt heavy processing中断重度处理
【发布时间】:2020-02-17 23:57:16
【问题描述】:

我遇到了 rxjs 的问题。
基本上,我有一个方法可以发出 http 请求(使用 Angular 的 HttpClientModule),进行一些耗时的解析、排序等......然后将结果存储在 BehaviorSubject 中。

我的问题是请求不需要很长时间才能完成,但解析确实需要(简单的方法)。
我可以对需要中断(丢弃)先前处理的同一方法进行其他一些调用。
所有这些都需要能够通过布尔值来清除。


进程的一些表示:
中断

A   >-request--processing----|
A'  >--------------request--processing----|
A'' >-----------------------request--processing----|
  • AA' 打断并且永远不会完成
  • A'A'' 打断并且永远不会完成
  • A'' 完成

清除

A      >-request--processing----|
A'     >--------------request--processing----|
switch >----------------------stop----|
  • AA' 打断并且永远不会完成
  • A'switch 打断并且永远不会完成
  • switch 阻止任何新请求,只要它是 false

到目前为止,我无法找到在需要一些新请求时中断处理的方法或阻止新请求的合适方法。
我在想也许让我的解析方法返回一个 observable 并 mergeMapping 它......

欢迎提出任何想法。

【问题讨论】:

  • 当您说解析需要很长时间时,只是为了澄清:解析是同步的并且发生在客户端?如果 JS 是单线程的,除非你开始使用网络工作者,否则你将无法做很多事情
  • 是的,一切都是客户端(不幸的是,无法访问后端)。我想我设法查明了我的瓶颈。我会尽快尝试的。关于网络工作者,我已经考虑过,但角度很痛苦......
  • 一位同事创建了github.com/cloudnc/observable-webworker,非常棒。我还使用该库为 Enigma 机器构建了一个蛮力机制,并在此处写到:dev.to/maxime1992/… 它让您可以通过流完全抽象 Web Worker,因此它实际上很容易在您的用例中使用我相信:)
  • 我会检查的。谢谢;)

标签: angular rxjs


【解决方案1】:

您可以将您的 observable 设置为 Subscription 变量。

用法示例:

import { Subscription } from 'rxjs/internal/Subscription';

/...

public subscription: Subscription;

onInit() {
    this.getData();
}

getData() {
    this.subscription = this.myService.getA().subscribe(...)
}

cancelService() {
   this.subscription.unsubscribe(); // This will cancel the request
}

【讨论】:

    猜你喜欢
    • 2012-09-21
    • 2018-11-30
    • 2014-09-07
    • 2011-03-09
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多