在AbortController.abort()之后如何启动另一个请求?

时间:2018-06-28 20:56:36

标签: asynchronous httprequest fetch abort

我已阅读有关使用AbortController.abort()取消获取请求的信息。有没有办法在调用此命令后再次启动请求而不中止请求?

例如,在this demo from MDN中,单击取消下载后,单击下载视频将再次触发提取,但立即中止。

>

是否有一种方法可以再次允许此请求而不中止它?因此,在这种情况下,如何单击下载视频开始下载,单击取消下载取消下载,然后单击下载视频 >再次重新开始下载?例如,如果用户意外点击取消下载 ...

3 个答案:

答案 0 :(得分:1)

您只是不能重用或重置position:absolute, left:0或其信号。如果需要重置它,则必须创建一个新的AbortController实例。

我认为这是设计使然。否则可能会变得混乱例如如果您将控制器移交给某个外部库或向某个外部库发出信号,突然它们可能会意外地中止和取消中止您的内部状态。

答案 1 :(得分:0)

我知道这可能有点晚了,但是我还是留下了这个答案,以防万一有人需要它。

我不知道这是否是最佳方法,但是为了继续进行提取请求(带有“相同”信号),我必须为每个请求创建一个新的AbortController实例。

对于我来说(所有代码都包含在类声明中),我每次都删除并创建一个新实例,就像这样:

class Foo Extends Bar {

    abort_controller_instance = false;

    constructor(params){
        super(params);
        this.resetOrStartAbortController();
    }

    resetOrStartAbortController(){
        if(this.abort_controller_instance){
            delete this.abort_controller_instance;
        }
        this.abort_controller_instance = new AbortController();
    }

    abortFetchRequest(){
        if(this.abort_controller_instance){
            this.abort_controller_instance.abort();
            this.resetOrStartAbortController();
        }
    }

    ...

}

可能不是最优雅的解决方案,但它可以工作。

致谢!

答案 2 :(得分:0)

  

例如,在MDN的此演示中,单击“取消下载”后,单击“下载视频”将再次触发抓取操作,但立即中止操作。

他们修复了example。单击Cancel download后,您将可以开始新的下载并一次又一次取消它。为了实现Download button每次都实例化一个新的 AbortController ,因此您每次都会获得一个中止的新信号:

downloadBtn.addEventListener('click', fetchVideo);

function fetchVideo() {
  controller = new AbortController;
  signal = controller.signal;
  // ...

因此可以为每个您希望取消的请求实例化新的AbortControllers。