Обещание: пропустить все выполнить и отклонить реакции, но выполнить .финал - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть функция с именем request:

function request (endpoint) {
  return axios.request(endpoint).then(api.onSuccess).catch(api.onError)
}

api.onSuccess:

  onSuccess (response) {
    let breakChain = false
    ... some logic goes here ...
    return breakChain ? (new Promise(() => {})) : response
  }

api.onError:

  onError (error) {
    let breakChain = false
    ... some logic goes here ...
    if (breakChain) {
      return new Promise(() => {})
    } else {
      throw error
    }
  }

api содержит множество функций, которые представляют различные вызовы API на основе предоставленных данных конечных точек и возвращают request(endpoint).

В настоящее время, как вы видите, у меня есть код, который возвращает Promise с пустым исполнителем, который всегда находится в состоянии ожидания, чтобы остановить цепочку последующих обработчиков .then(...) и .catch(...), поскольку они просто бесконечно ждут, пока это обещание селиться. Это делается для обработки определенных ответов API, которые имеют общую обработку ответов (например, ответы с кодом> = 500). Проблема в том, что теперь мне нужен вызов .finally() (как в Vue cookbook - https://vuejs.org/v2/cookbook/using-axios-to-consume-apis.html#Dealing-with-Errors), чтобы восстановить состояние какого-либо компонента, независимо от того, есть ли ошибка или нет, но этот подход в ожидании Promise является препятствием.

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

Обновление. Я не упомянул важный бит - api.onSuccess и api.onError являются базовыми обработчиками. В других компонентах приложения есть дополнительные обработчики, добавленные в конец этой базовой цепочки, представленной в функции request. Обычная цепочка некоторых вызовов API имеет следующую результирующую форму:

return axios.request(endpoint).then(api.onSuccess).catch(api.onError).then((response) => {...}).catch(() => {...}).finally(() => {...})

(иногда нет блока .finally() или .catch(...))

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Можно ли пропустить все последующие вызовы .then(...) и .catch(...) в одном из таких обработчиков, чтобы перейти непосредственно к .finally()?

номер

В настоящий момент я останавливаю цепь, просто бесконечно ожидая - но этот подход в ожидании Обещания является препятствием.

Действительно, не делай этого. Вы можете пропустить обработчики then с помощью , используя отклонения (исключения) для управления потоком , но более подходящий способ - обработать это, вложив часть цепи, которая должна быть пропущена внутри if заявление .

Это делается для обработки определенных ответов API, которые имеют общую обработку ответов (например, ответы с кодом> = 500)

Для этого вы должны использовать что-то вроде

return axios.request(endpoint).then(response => {
    …
}).catch(error => {
    if (api.handleCommonError(error)) return; // returns false if it couldn't handle the error
    …
}).finally(() => {
    …
});

Да, вы не можете скрыть такого рода обработку ошибок внутри функции api.request.

0 голосов
/ 23 апреля 2019

Вы можете использовать async и await.Все современные браузеры поддерживают их, и ваш упаковщик может сделать их совместимыми со старыми браузерами.

Например:

async function request (endpoint) {
  try {
    const response = await axios.request(endpoint);
    return api.onSuccess(response);
  } catch (err) {
    api.onError(err);
  } finally {
    // Always executed, even if no error was thrown
  }
}

Вы также можете сделать это более традиционно:

function request (endpoint) {
  return axios.request(endpoint).then(api.onSuccess, api.onError).then(() => {
    // Code is always executed after error / success
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...