2016-07-28 3 views
2

Я хочу добавить логику повтора в свой HTTP-сервис javascript, который внутренне использует 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

возвращение 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)) 
}