真正中断网络传输的取消请求

81 阅读1分钟

我们发送网络请求一般有2种方式:

1.XMLHttpRequest 也就是常说的XHR, axios封装的就是它

2.fetch

然后,能够做到真正中断网络传输的只有fetch, 我们使用的axios里面的取消网络请求不是真正的取消.

取消请求需要使用一个对象AbortController

客户端: index.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  name: <input type="text" id="name">
  <hr>
  <div>
    来自服务器: <div id="content"></div>
  </div>
  <script>
    const nameDOM = document.getElementById('name');
    const contentDOM = document.getElementById('content');
    let controller = null;

    function send(value) {
      // 每次发送新的请求前先取消上次请求
      controller && controller.abort();
      controller = new AbortController();

      fetch('http://localhost:8848/list?name=' + value, {
        method: 'GET',
        signal: controller.signal
      })
        .then(data => data.json())
        .then((res) => {
          console.log(res);
          contentDOM.innerHTML = JSON.stringify(res);
        })
        .catch((err)=>{
          console.log(err);
          console.log(err.message);
        });
    }

    nameDOM.oninput = function (e) {
      send(nameDOM.value);
    }
  </script>
</body>

</html>

服务器: server.js

const express = require('express');
const cors = require('cors');
const app = express();

app.use(cors());

app.get('/list', (req, res, next)=>{
  setTimeout(() => {
    res.send({
      success: true,
      data: {
        tmp: Date.now(),
        originValue: req.query.name
      }
    });
  }, 100);

});

app.listen(8848, ()=>{
  console.log('监听完毕');
});