Разорвать цепочку .finally () - PullRequest
1 голос
/ 06 мая 2020

У меня есть следующая цепочка.

  return axios
        .get(actionUrl, {
            params: {
                action: 'action3'
            },
        })
        .finally(() => axios.get(actionUrl, {
            params: {
                action: 'action3'
            },
        }))
        .finally(() => axios.get(actionUrl, {
            params: {
                action: 'action6'
            },
        }))
        .finally(() => axios.get(actionUrl, {
            params: {
                action: 'action1'
            },
        }))

Мне нужно последовательно вызывать разные конечные точки по порядку, даже если предыдущая не работает. Однако в случае тайм-аутов конечной точки я хочу разорвать цепочку. Возможно ли это без использования .then и .catch и повторения в них одного и того же кода?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

Функция finally предназначена именно для того, чтобы убедиться, что внутренняя функция выполняется, даже если есть исключение. Вы можете получить желаемое поведение, используя только один finally, например:

axios.get()
  .then(() => doStuffOnSuccess())
  .finally(() => {
    axios.get().then(() => doFinallyStuff1())
       .then(() => doFinallyStuff2())
       .then(() => doFinallyStuff3())
       .catch(e => console.error("Finally had trouble",e));
  });

Таким образом, если что-либо в функции finally завершится по истечении времени ожидания или выйдет из строя, это приведет к разрыву цепочки. Имея последний улов, вы избежите его отбрасывания вверх по цепочке.

Это предполагает, что вы используете finally правильно, и все в этом всегда должно выполняться после предыдущих вызовов fini sh, даже если есть ошибки.

0 голосов
/ 06 мая 2020

Это возможно с помощью then и catch. Вы не должны использовать finally, если не хотите, чтобы обратный вызов запускался в случае ошибки.

Мне нужно последовательно вызывать разные конечные точки по порядку, даже если предыдущая не работает. Однако в случае тайм-аутов конечной точки я хочу разорвать цепочку

Итак, вы хотите не вызывать их, когда предыдущий выходит из строя (с таймаутом), все, что вы хотите сделать игнорировать ошибки, не связанные с тайм-аутом. Вот для чего следует использовать catch:

function callEndpoint(action) {
  return axios.get(actionUrl, { params: { action } }).catch(err => {
    if (isTimeout(err))
      throw err
    else
      ; // ignore the error, return undefined
  })
}

Затем просто объедините их в цепочку:

callEndpoint('action3').then(() => callEndpoint('action6')).then(() => callEndpoint('action3'))
0 голосов
/ 06 мая 2020

Вы знакомы с async/await? Как правило, вы не должны связывать finally таким образом, всегда лучше создать рекуррентную функцию, например:

const fetchSomething = async () => {
   try { 
     const result = await axios.get();

     if (...when fetching should stop...) {
       return result;
     }

     return fetchSomething();
   } catch(error) {
     return fetchSomething();
   }
}

Но с повторяющейся функцией чрезвычайно важно создать некоторый переключатель отключения, чтобы предотвратить ее выполнение навсегда - для Например, установите какой-то тайм-аут, 1 минуту или около того, и если этот предел превышен, прекратите выполнение. С generators и yield, наверное, будет еще проще, но я никогда не использовал это решение

...