Javascript 当新的请求到来时,我想取消我以前的请求

Javascript 当新的请求到来时,我想取消我以前的请求,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,我有一个文本框,对每个输入字符进行http调用。但我的问题是,当用户输入下一个字符时,我想取消我的请求,以防我的上一个响应没有出现。您不能按预期的方式取消HTTP请求;向服务器发送HTTP请求后,请求已发送,即使忽略响应,服务器仍将尝试满足请求 例外情况: “流式”HTTP请求(可终止) 如果使用HTTP请求触发服务器上的作业启动,并使用单独的HTTP请求取消该作业(但这仍然涉及两个成功的HTTP请求,而不是取消一个) 您可能希望查看JavaScript中的“去Bouncing”或“debo

我有一个文本框,对每个输入字符进行http调用。但我的问题是,当用户输入下一个字符时,我想取消我的请求,以防我的上一个响应没有出现。

您不能按预期的方式取消HTTP请求;向服务器发送HTTP请求后,请求已发送,即使忽略响应,服务器仍将尝试满足请求

例外情况:

  • “流式”HTTP请求(可终止)
  • 如果使用HTTP请求触发服务器上的作业启动,并使用单独的HTTP请求取消该作业(但这仍然涉及两个成功的HTTP请求,而不是取消一个)
您可能希望查看JavaScript中的“去Bouncing”或“debouncing”,其中函数可以在每次按键时调用一次,条件是在过去N毫秒内没有调用,例如

[编辑]需要明确的是,一些工具将允许您“取消”仍在运行中的HTTP请求(如评论人所说的rxjs)。但是,如果服务器已经接收到调用,那么这并不一定会阻止服务器处理调用,而且,可取消性取决于您的HTTP实现。阅读更多信息。

您可以使用rxjs操作符来完成此操作

在每次发射时,先前的内部可观测值( 您提供的函数)被取消,新的可观察对象被取消 订阅。你可以通过短语切换到一个新的 可见的。这非常适用于typeaheads这样的场景 您不再关心上一个请求的响应 当新输入到达时

例如:

// RxJS v6+
import { interval, fromEvent } from 'rxjs';
import { switchMap } from 'rxjs/operators';

fromEvent(document, 'click')
  .pipe(
    // restart counter on every click
    switchMap(() => interval(1000))
  )
  .subscribe(console.log);
Demoraste来自angular大学博客。您可以看到,当新请求到来时,上一个请求将被取消


类似的内容可能有助于实现您的目标:还有其他示例,但这可能会让您对每个输入字符的http有一个很好的了解。您能告诉我如何处理这种情况吗。如果每个请求都成功,那么它可以增加我正在使用的服务器上的负载。我只想知道,我的新请求将只在服务器上进行,并取消所有以前的请求。使用observables(rxjs),您可以取消http请求。@ManuelPanizzo有点像是真的,尽管rxjs不会阻止服务器接收请求。因此,当您只是将响应放在地板上,而您的客户端不再需要处理响应数据时,您仍然在启动请求,并且您的服务器可能会尝试满足它(例如,花费CPU时间)。对于有状态请求,这不是真正的取消。很高兴知道询问者的用例以确定是否是这样。@somjikatiyar不幸的是,无法保证您的服务器不会收到任何过时的请求。如果您能承受更多毫秒的延迟,我建议您在调用中添加延迟,并且只有在上次调用之后没有发生其他事件时才发出请求。如果这听起来像你需要的,我可以帮你写一些示例代码。嗨,伙计们,谢谢你们的宝贵意见。很好,我使用swichmap,我已经找到了解决问题的替代方案。