美文网首页
【cancelToken】axios取消请求

【cancelToken】axios取消请求

作者: Adder | 来源:发表于2021-06-21 12:08 被阅读0次

    🧐 这次碰到一个问题,初始化页面,某些原因导致会请求依次两个接口,实际上只需要其中一次的接口返回数据;
    但是由于接口响应速度不一致,导致最后拿到的数据并不是最后那次请求的结果;
    🤓 我们知道promise的有一个明显缺点就是,无法取消请求;不过axios作为一个成熟的插件,有提供API,满足我们的这种需求。
    🔍于是找到解决办法是,使用 axios.CancelToken构造函数 生成取消函数【方法1】


    1️⃣ axios.CancelToken构造函数

    CancelToken构造函数生成取消函数

     let cancelFn: any; // 取消函数
     useEffect(() => {
        if (满足request1请求条件) {
          cancelFn && cancelFn(); //使用request1 就取消request2
          request1();
        } else  { /使用request1 取消request1
          cancelFn && cancelFn();
          request2();
        }
      }, []);
    
    // 第一个请求
        const request1 = async () => {
        const { CancelToken } = axios;
        const res: any = await request({
          url: '/api/datat******nary',
          method: 'POST',
          params: {
            name: searchKey,
            datasourceId: currentSource,
          },
          cancelToken: new CancelToken((cf: any) => {
            cancelFn = cf;
          }),
        });
        
    // 第二个请求
      const request2 = aysnc () => {
        const { CancelToken } = axios;
        const res: any = await request({
          url: '/api/**********tionary',
          method: 'GET',
          params: {
            name: searchKey,
          },
          cancelToken: new CancelToken((cf: any) => {
            cancelFn = cf;
          }),
        });
    

    针对单个请求A发多次的情形(A1,A2...An), An都会带上cancelToken(标记),A(n+1)发起时会将An请求直接canceled(不再处理An请求响应)

    2️⃣ axios.CancelToken.source

    CancelToken.source生成取消令牌token和取消方法cancel

      const CancelToken = axios.CancelToken;
      const source = CancelToken.source();
    
      axios.get('/user/12345', {
        cancelToken: source.token
      }).catch(function(thrown) {
        if (axios.isCancel(thrown)) {
        console.log('Request canceled', thrown.message);
        } else {
        // handle error
         }
      });
    
      axios.post('/user/12345', {
        name: 'new name'
      }, {
        cancelToken: source.token
      })
    
      source.cancel('Operation canceled by the user.');
    

    相关文章

      网友评论

          本文标题:【cancelToken】axios取消请求

          本文链接:https://www.haomeiwen.com/subject/ktlyyltx.html