Angular 有条件地取消订阅请求

Angular 有条件地取消订阅请求,angular,ecmascript-6,observable,Angular,Ecmascript 6,Observable,当其他请求已经存在时,是否有方法取消订阅请求 在我的情况下,我希望保持最后一个请求工作,并取消可能的其他请求,因为每次ngModel更改时,都会启动一个请求 我是这样做的: onFieldChange(searchText: string) { if(typeof request != 'undefined') request.unsubscribe(); let request = this.searchService.loadEntities(searchText)

当其他请求已经存在时,是否有方法取消订阅请求

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

我是这样做的:

  onFieldChange(searchText: string) {

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

    let request = this.searchService.loadEntities(searchText)

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

        this.searchResults = resp;
      })
  }
在AngularJS中,这段代码可以很好地工作

if(typeof request == 'object') request.$cancelRequest();
对于Angular 2和es6,我有一个错误“在声明之前使用了块作用域变量'request'



我明白这一点,但我能做什么?

您需要使用switchMap操作符,该操作符处理两个观察值,并在外部观察值(字段更改)发出新值时立即取消内部观察值(loadEntities)。您可以对字段使用FormControl,它会自动将值作为可观察项发出。看看这个代码示例:

您需要使用switchMap操作符,它处理两个观察值,并在外部观察值(字段更改)发出新值时立即取消内部观察值(loadEntities)。您可以对字段使用FormControl,它会自动将值作为可观察项发出。看看这个代码示例:

在声明它正确之前,您意识到您已经使用了
request
变量?是的,但我测试了它的类型,所以我测试
request
变量是否像这样存在?否?为什么不将它分配到一个字段中?像
private request
那么你可以像
this.request=..
一样分配给它。是的,我知道你的意思。但我会看到@YavokFain的回复,这似乎最适合我的情况。Thank's您知道在声明正确之前使用了
request
变量吗?是的,但我测试了它的类型,所以我测试
request
变量是否像这样存在?否?为什么不将它分配到字段中?像
private request
那么你可以像
this.request=..
一样分配给它。是的,我知道你的意思。但我会看到@YavokFain的回复,这似乎最适合我的情况。谢谢,我有点难以理解。我将更精确地检查这一点。Thank’s You然后从这个代码示例开始,了解如何从FormControl管理的输入字段订阅事件:是的,我在上面。但在我的例子中,我有一个表单标签,所以我必须设置formGroup指令,创建一个formBuilder。。。与从构造函数直接访问formControl.changeValue()的链接不同。确定。这很好!像这样,我可以用操作符控制调用我的HTTP请求的行为:D像debouceTime()和distinctUntilChanged()。我必须在angular JS中手动执行这些操作。。。谢谢你,我现在明白了:)哼,有点难懂。我将更精确地检查这一点。Thank’s You然后从这个代码示例开始,了解如何从FormControl管理的输入字段订阅事件:是的,我在上面。但在我的例子中,我有一个表单标签,所以我必须设置formGroup指令,创建一个formBuilder。。。与从构造函数直接访问formControl.changeValue()的链接不同。确定。这很好!像这样,我可以用操作符控制调用我的HTTP请求的行为:D像debouceTime()和distinctUntilChanged()。我必须在angular JS中手动执行这些操作。。。谢谢你,我现在明白了:)