代码之家  ›  专栏  ›  技术社区  ›  OliverRadini

排队异步请求

  •  -1
  • OliverRadini  · 技术社区  · 7 年前

    我正在尝试设置一个排队系统,以便重复post请求 n 时间,间隔 i

    到目前为止我已经有了这个,感觉有点凌乱和粗糙。我觉得我可能错过了一个简单得多的解决方案,但似乎什么也找不到:

    // this is mocked to avoid a wall of code
    const postData = (url, data) => Promise.resolve(true);
    
    // this is mocked to avoid a wall of code
    const resIsFailed = () => true;
    
    const requestChain = ({
      url,
      data,
      maxRequests,
      requestTimeout,
      currentRequest = 0,
      requestIncrement = increment => increment,
    }) => {
    
      // exit condition
      if (currentRequest >= maxRequests || (!maxRequests)) {
        console.log('Too many failed requests');
        return Promise.reject(new Error('Too many attempts'));
      }
    
      // post the data, if it fails, try again
      postData(
        url,
        data,
      ).then(res => {
      
        if (resIsFailed(res)) {
        
          console.log('Failed response: ');
          console.dir(res);
          
          setTimeout(() => {
            requestChain({
              url,
              data,
              maxRequests,
              requestTimeout: requestIncrement(requestTimeout),
              currentRequest: currentRequest + 1,
              requestIncrement,
            });
          }, requestTimeout);
          
        } else {
        
          return Promise.resolve(res);
          
        }
      });
    }
    
    requestChain({
      url: 'fail',
      data: {},
      maxRequests: 5,
      requestTimeout: 100,
    })
    1 回复  |  直到 7 年前
        1
  •  -2
  •   Moritz Herbert    7 年前

    这个 async 库对于控制所有类型的异步链接等都是非常有用的 async.retry

    推荐文章