Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何中止提取请求?_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript 如何中止提取请求?

Javascript 如何中止提取请求?,javascript,ecmascript-6,Javascript,Ecmascript 6,我一直在用新的而不是旧的 这是伟大的,但我错过了一个关键的功能 我找不到有关该功能的任何信息 谢谢 更新: 中止提取的黑客解决方法 基本上,您可以在web worker中启动提取,然后取消web worker以中止提取这仍然是一个悬而未决的问题 所有相关的讨论都可以在这里找到 :(可以通过中止控制器中止提取: export function cancelableFetch(reqInfo, reqInit) { var abortController = new AbortControll

我一直在用新的而不是旧的

这是伟大的,但我错过了一个关键的功能

我找不到有关该功能的任何信息

谢谢

更新: 中止提取的黑客解决方法

基本上,您可以在web worker中启动提取,然后取消web worker以中止提取

这仍然是一个悬而未决的问题 所有相关的讨论都可以在这里找到


:(

可以通过中止控制器中止提取:

export function cancelableFetch(reqInfo, reqInit) {
  var abortController = new AbortController();
  var signal = abortController.signal;
  var cancel = abortController.abort.bind(abortController);

  var wrapResult = function (result) {
    if (result instanceof Promise) {
      var promise = result;
      promise.then = function (onfulfilled, onrejected) {
        var nativeThenResult = Object.getPrototypeOf(this).then.call(this, onfulfilled, onrejected);
        return wrapResult(nativeThenResult);
      }
      promise.cancel = cancel;
    }
    return result;
  }

  var req = window.fetch(reqInfo, Object.assign({signal: signal}, reqInit));
  return wrapResult(req);
}
用法示例:

var req = cancelableFetch("/api/config")
  .then(res => res.json())
  .catch(err => {
    if (err.code === DOMException.ABORT_ERR) {
      console.log('Request canceled.')
    }
    else {
      // handle error
    }
  });

setTimeout(() => req.cancel(), 2000);
链接:

var req = cancelableFetch("/api/config")
  .then(res => res.json())
  .catch(err => {
    if (err.code === DOMException.ABORT_ERR) {
      console.log('Request canceled.')
    }
    else {
      // handle error
    }
  });

setTimeout(() => req.cancel(), 2000);

  • 我通常使用类似于@ixrock的东西

    // Fetch and return the promise with the abort controller as controller property
    function fetchWithController(input, init) {
      // create the controller
      let controller = new AbortController()
      // use the signal to hookup the controller to the fetch request
      let signal = controller.signal
      // extend arguments
      init = Object.assign({signal}, init)
      // call the fetch request
      let promise = fetch(input, init)
      // attach the controller
      promise.controller = controller
      return promise
    }
    
    然后用

    let promise = fetchWithController('/')
    promise.controller.abort()
    

    这是因为您无法取消提取:(请参阅:如果您真的需要中止请求,请坚持使用Xhr可能重复的解决方法似乎有些过分,我最好填充提取,然后添加缺少的功能从Google的开发人员站点:感谢更新!尽管这意味着您需要为要中止的每个提取创建并保留一个AbortController(如果您可以中止一组获取,那么您将需要更少的时间)并在每次获取后销毁相应的已保存控制器-这绝非完美的解决方案,但比解决方法要好