【问题标题】:Unsubscribe Request conditionally有条件地取消订阅请求
【发布时间】:2017-04-20 00:56:00
【问题描述】:

当其他请求已经存在时,有办法取消订阅请求吗?

在我的情况下,我希望保持最后一个请求正常工作并取消可能的其他请求,因为每次 ngModel 更改时,都会启动一个请求。

我做了这样的事情:

  onFieldChange(searchText: string) {

    if(typeof request != 'undefined') request.unsubscribe();

    let request = this.searchService.loadEntities(searchText)

      .subscribe((resp: Search[]) => {

        this.searchResults = resp;
      })
  }

在 Angular JS 中,这段代码可以正常工作。

if(typeof request == 'object') request.$cancelRequest();

对于 Angular 2 和 es6,我有一个错误“在声明之前使用了块范围的变量 'request'”。

我明白这一点,但我该怎么办?

【问题讨论】:

  • 你意识到你在声明它之前已经使用了request变量吗?
  • 是的,但我测试了它的类型,所以我测试request 变量是否像这样存在?
  • 你为什么不把它分配给一个字段呢?像private request 一样,您可以像this.request = .. 一样分配给它
  • 是的,我知道你的意思。但我会看到@YavokFain 的回复,这似乎最适合我的情况。谢谢

标签: angular ecmascript-6 observable


【解决方案1】:

您需要使用 switchMap 运算符,该运算符适用于两个可观察对象,并在外部可观察对象(字段更改)发出新值时立即取消内部可观察对象(loadEntities)。您可以将 FormControl 用于您的字段,该字段会自动将值作为可观察项发出。看看这个代码示例:https://github.com/Farata/angular2typescript/blob/master/chapter5/bindings_and_events/app/observables/observable-events-http.ts

【讨论】:

  • 嗡嗡声有点难以理解。我将更准确地检查这一点。谢谢你
  • 然后从这个代码示例开始,了解如何从由 FormControl 管理的输入字段订阅事件:github.com/Farata/angular2typescript/blob/master/chapter5/…
  • 是的,我愿意。但在我的情况下,我有一个表单标签,所以我必须设置 formGroup 指令,创建一个 formBuilder ......这与你的 formControl.changeValue() 可以从构造函数直接访问的链接不同。
  • 好的。这很好!像这样,我可以用操作员控制调用我的 HTTP 请求的行为:D 像 debouceTime() 和 distinctUntilChanged()。我必须在 Angular JS 中手动完成这些工作......谢谢你我现在明白了:)
猜你喜欢
  • 2012-01-26
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多