当前位置: 首页 > 面试题库 >

如何取消HTTP fetch()请求?

夏元明
2023-03-14
问题内容

有一个新的API用于从JavaScript发出请求:fetch()。是否有任何内置的机制可以在飞行中取消这些请求?


问题答案:

fetch现在支持signal截至2017年9月20日的参数,但目前 并非所有浏览器都支持此参数

2020更新:
大多数主流浏览器(Edge,Firefox,Chrome,Safari,Opera和其他一些浏览器)都支持该功能,该功能已成为DOM生活标准的一部分。(截至2020年3月5日)

这是我们很快就会看到的更改,因此您应该可以使用AbortControllers 取消请求AbortSignal

长版

如何:

它的工作方式是这样的:

第1步
:您创建了一个AbortController(现在我只使用了这个)

const controller = new AbortController()

步骤2 :您会收到AbortControllers信号,如下所示:

const signal = controller.signal

第3步 :您将传递为signal,例如:

fetch(urlToFetch, {
    method: 'get',
    signal: signal, // <------ This is our AbortSignal
})

步骤4 :只要需要,就中止:

controller.abort();

这是一个工作原理示例(可在Firefox 57+上运行):

<script>

    // Create an instance.

    const controller = new AbortController()

    const signal = controller.signal



    /*

    // Register a listenr.

    signal.addEventListener("abort", () => {

        console.log("aborted!")

    })

    */





    function beginFetching() {

        console.log('Now fetching');

        var urlToFetch = "https://httpbin.org/delay/3";



        fetch(urlToFetch, {

                method: 'get',

                signal: signal,

            })

            .then(function(response) {

                console.log(`Fetch complete. (Not aborted)`);

            }).catch(function(err) {

                console.error(` Err: ${err}`);

            });

    }





    function abortFetching() {

        console.log('Now aborting');

        // Abort.

        controller.abort()

    }



</script>







<h1>Example of fetch abort</h1>

<hr>

<button onclick="beginFetching();">

    Begin

</button>

<button onclick="abortFetching();">

    Abort

</button>

资料来源:

  • AbortController的最终版本已添加到DOM规范中
  • 现在,将获取规范的相应PR合并。
  • 跟踪AbortController的实现的浏览器错误可在此处找到:Firefox:#1378342; Chromium:#750599; WebKit:#174980; Edge:#13009916。


 类似资料:
  • 问题内容: 我需要能够 使用 OKHTTP* 来 管理 一些请求,使用来通过输入地址来接收一些预测。该 问题是 ,我插入每次 CHAR 它将使一个新的请求,但在同一时间,我需要取消前一个!例如:纽约市=同时请求13个!因此,我仅使用一个实例来尝试取消已请求但没有成功的任何内容。这就是我所做的! * 我检查对象是否为null并取消请求,但仍然不断! 问题答案: 关于以下内容:

  • 问题内容: 我有一个AJAX请求,将每5秒发送一次。但是问题出在AJAX请求之前,如果先前的请求没有完成,我必须中止该请求并提出新的请求。 我的代码是这样的,如何解决这个问题? 问题答案: jQuery ajax方法返回一个XMLHttpRequest对象。您可以使用此对象取消请求。 XMLHttpRequest具有中止方法,该方法会取消请求,但是如果请求已经发送到服务器,那么即使我们中止请求 ,

  • 问题内容: 在AngularJS中给出Ajax请求 如果启动另一个请求(相同的后端,例如不同的参数),取消该请求的最有效方法是什么? 问题答案: 此功能通过超时参数添加到1.1.5版本中:

  • 问题内容: 我用于ajax请求,而+ 用于渲染UI。在我的应用程序中,有第三方时间轴(reactJS组件)。时间轴可以通过鼠标滚动进行管理。应用程序在发生任何滚动事件后发送对实际数据的ajax请求。问题是服务器上的请求处理可能比下一个滚动事件慢。在这种情况下,应用可能会有几个(通常是2-3个)请求已被弃用,因为用户会进一步滚动。这是一个问题,因为每次接收新数据时线都会开始重绘。(因为它是react

  • 我使用处理ajax请求,使用渲染UI。在我的应用程序中,有第三方时间线(reactJS组件)。时间线可以通过鼠标滚动来管理。在任何滚动事件之后,应用程序都会发送实际数据的ajax请求。问题是服务器上的请求处理可能比下一个滚动事件慢。在这种情况下,应用程序可能有几个(通常为2-3个)请求,由于用户进一步滚动,这些请求已经被弃用。这是一个问题,因为每次收到新数据时,时间线都开始重新绘制。(因为它是re

  • 如何取消/中止angular 4中所有挂起的HTTP请求。 有一个取消HTTP请求的方法,但是如何一次取消所有挂起的请求。 尤其是在改变路线的时候。 我做了一件事 但是如何在全球范围内实现这一点 有什么想法吗?