RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 680034
Accepted
ravend
ravend
Asked:2020-06-16 18:11:51 +0000 UTC2020-06-16 18:11:51 +0000 UTC 2020-06-16 18:11:51 +0000 UTC

如何取消抓取?

  • 772

在表单过滤器 + 网格上

我通过 fetch 从后面获取数据

网格用接收到的数据更新

请求很重/很长

当用户在前一个请求完成之前生成一个新请求时,就会出现问题

网格中的内容被多次更新

是否有可能以某种方式中断/放弃“过时”的请求?

PS 在 clearTimeout / setTimeout 中包装 fetch 在这种情况下无济于事

PSS或者如何检查接收到的数据是否是上次promis的结果?

UPDATE

翻页ReactJS

发布代码不会给任何东西,tk。一般问题

情况是没有“FIND”按钮,请求是为过滤器中的每个“喷嚏”生成的

包含 10 个字段和下拉列表的巨大过滤器

出于客户的意识形态原因,在每次请求时禁用它是行不通的

我看到唯一的选择是拒绝或忽略过时的请求

但想看看BEST PRACTICES

UPDATE2

class View extends Component {

    ...

    updateItems(data) {
        self.state.timeoutItems && clearTimeout(self.state.timeoutItems);
        self.state.timeoutItems = setTimeout(() => {
            self.props.onGetItems(self.calcParams());
        }, config.timeoutItems );
    }  
}


export default connect(
    state => ({
        items: state.items
    }),
    dispatch => ({
        onGetItems: (o) => {
            dispatch(getItems(o));
        }
    })
)(View);

...

export const getItems = (o = {}) => dispatch => {

    ...

    fetch(url, {  
        method: 'GET',              
        headers: {
            "Content-type": "application/json",
            "Accept": "application/json"
        },  
    })
    .then( (response) => response.json() )
    .then((data) => {

        ==>> (1) <<==

        dispatch({ type: 'FETCH_ITEMS_SUCCESS', data: data });
    })  
    .catch((error) => {
        console.log('Request failed', error);  
    });
}

是否可以在第(1)点确定结果与哪个承诺相关?

javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    ThisMan
    2020-06-16T19:09:00Z2020-06-16T19:09:00Z

    目前fetch还不能原生取消,这是因为它使用了Promise-ov机制,也没有中断机制。因此,您必须设计并编写拐杖

    有一个 axios 库,它也使用Promise它,虽然它似乎仍然适用于标准库XMLHttpRequest,但有一个选项可以取消它:

    var CancelToken = axios.CancelToken;
    var 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
      }
    });
    
    // cancel the request (the message parameter is optional)
    source.cancel('Operation canceled by the user.');
    

    如果你想使用原生的,你fetch现在必须自己编写请求取消的实现(即使那样,这也不是真正的请求取消,因为响应无论如何都会来,你只是忽略它)

    更新程序

    关于这个话题的讨论

    • 3
  2. user207618
    2020-06-16T19:22:43Z2020-06-16T19:22:43Z

    fetch 没有办法取消,似乎也不是预料之中的。

    您可以选择最新的一个并像这样绘制它:

    let counter = 0; // Флаг итератора количества запросов
    
    function buildRequest(){
      console.info(`Запрос #${counter + 1} послан`);
      makeRequest(++counter); // Новый запрос получает более большое число
    }
    
    function makeRequest(num){
      setTimeout(_ => {
        if(counter > num){ // Если итератор больше текущего числа, значит был запрос позже, выходим
          console.info(`Запрос #${num} отменён, есть запросы позже`);
          return;
        }
        
        // Иначе рисуем ответ
        console.info(`Запрос #${num} начинает отрисовку`);
      }, 1000);
    }
    
    buildRequest();
    setTimeout(_ => buildRequest(), 500);
    setTimeout(_ => buildRequest(), 1000);

    但是服务器仍然会在处理器的汗水下工作。

    否则,要么将请求排队,要么让过滤器在请求时阻塞。

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5