2016-07-28 91 views
2

我想添加重試邏輯到我的JavaScript HTTP服務,它在內部使用Axios並返回承諾。目標是重試讀取/發佈,直到超過解析或重試限制。我想出了這個草案(不工作,因爲它是)如何做遞歸承諾

fetchSomething(numRetry) { 

     if (!numRetry) 
      numRetry = 0 

     return new Promise(function(resolve, reject) { 
      axios.get('/services/rest/vopa/sanomaloki/virheet') 
       .then(response => resolve(response)) 
       .catch(response => { 
        if (numRetry > FETCH_RETRY_LIMIT) 
         reject(response) 
        else 
         return fetchSomething(numRetry + 1) 
       }) 
     }); 
    } 

據我所知,呼籲fetchSomething在抓創建新的決心和拒絕的功能,但我想它來解決或拒絕當初的諾言

+0

return fetchSomething(numRetry ++) – degr

+0

認爲更好地調用您的函數內部的'拒絕'回調,在一個抽象級別更高 – degr

回答

0

這個怎麼樣簡單的版本(未經測試!):

function fetchSomething(numRetry = 0) { 
    return axios.get('/services/rest/vopa/sanomaloki/virheet') 
     .catch(response => { 
      if (numRetry > FETCH_RETRY_LIMIT) 
       return Promise.reject(response); // pass it on 
      else 
       return fetchSomething(numRetry + 1); // might work 
     }); 
} 
0

你並不需要創建一個新的Promise。實際上使用Promise構造函數表明你做錯了什麼。 Demo

function fetchSmth(num) { 
    num = num || 0 

    return num > FETCH_RETRY_LIMIT 
     ? Promise.reject(new Error('Fetch retry limit reached')) 
     : axios 
      .get('/services/rest/vopa/sanomaloki/virheet') 
      .catch(fetchSmth.bind(null, num + 1)) 
}