use::

轮询异步请求

较好的方案

  • 使用链式setTimeout()而不是setInterval,保证上一个请求结束后才能执行下一个请求
    • 图示:
  • 如果请求参数可能有变更
    • 则在每次请求响应后判断参数是否有变更([use::js判断对象相同]),如果有变更就不再继续下一次setTimeout(),并且抛弃当前相应的结果
    • 参数变更时触发新的setTimeout()
    • 代码示例:
      let currentParams={};
       
      function pollAsyncRequest(params) {
        let data await = getData(params)
        // 判断参数是否有变更
        if (JSON.stringify(currentParams) !== JSON.stringify(params)) {
          // 不触发下一次轮询
        } else {
          console.log('参数没有变更,继续下一次轮询');
          setTimeout(() => pollAsyncRequest(params), 1000);
        }
      }
       
      // 启动轮询异步请求
      pollAsyncRequest(params);
      function updatePoll(){
        currentParams = {}//设置新的参数
        pollAsyncRequest(currentParams)
      }
  • 如果轮询需要暂停和继续
    • 暂停时清除现在的计时器,继续时新的计数器
    • 请求响应后判断是否已暂停,暂停就不继续下一次计时了
  • child::react 自用轮子 轮询钩子
指向原始笔记的链接