排队异步请求

时间:2018-08-20 12:58:43

标签: javascript promise

我正在尝试设置一个排队系统,以便以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 个答案:

答案 0 :(得分:-2)

async库对于控制各种异步链接等非常有用。您可能想看看async.retry。它应该给您确切的行为。

相关问题