ES6 Promise Retry模式实现

假设有一个异步获取数据的请求每次都在500ms后失败, 报错“server unavailable”。

function fetchData() {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      reject('server unavailable');
    }, 500);
  });
};

假设我们最多重试3次就不再尝试发送该请求,每次重试间隔100ms。

// parameter #1, the function to return a Promise
// parameter #2, the max retry times
// parameter #3, the delay between each attempt
retry(fetchData, 3, 100)

retry函数参数已确定,函数体具体实现如下:

retry = function(fn, times, delay) {
  var err = null;
  return new Promise(function(resolve, reject) {

    var attempt = function() {
      fn().then(resolve).catch(function(err) {
        console.log(`Attempt #${times} failed`);
        if (0 == times) {
          reject(err);
        } else {
          times--;
          setTimeout(function(){
            attempt()
          }, delay);
        }
      });
    };

    attempt();

  });
};

 

你可能感兴趣的:(前端)