Когда модальный режим, основанный на обещаниях, закрывается, что является хорошим шаблоном для обработки последующих ошибок? - PullRequest
0 голосов
/ 25 мая 2018

Скажем, у вас есть API для создания модального типа, который запрашивает у пользователя значение, и вызов для создания этого модального параметра возвращает обещание, которое либо разрешается до заданного значения, либо отклоняется, если модальное окно закрыто / отменено.Пример:

prompt("Enter a value.").then(val => { }).catch(() => { /* closed */ });

Предложенный мной шаблон для работы с отклоненным обещанием для закрытого модального режима состоит в том, чтобы просто добавить оператор catch с лямбда-выражением «без операции», как показано выше.Проблема заключается в том, что, если вы хотите построить цепочку обещаний, когда модальное значение успешно выполнено , то любые ошибки в последующей логике также будут молча терпеть неудачу из-за лямбды «без операции»:

prompt("Enter a value.")
  .then(val => { /* logic that could throw an error */ })
  .then(() => { /* method that may return another promise */ })
  .catch(() => { }) // Silent fail
  .then(() => { /* logic after modal */ })

Очевидным решением было бы просто переместить операторы then после перехвата «без операции» и перехватить их с помощью новых операторов, но помните, что эти блоки должны выполняться только в том случае, если модал успешен, и поэтомуне может идти после вышеприведенного catch заявления.

Что бы вы сделали?

1 Ответ

0 голосов
/ 25 мая 2018

Я также недавно реализовал нечто подобное, и мой подход заключался в том, что модал вернет undefined, если он будет закрыт или отменен.Я пытаюсь зарезервировать catch() для «истинных» ошибок.

Однако вы также можете помнить, что вы можете throw что угодно, не только Error с.Итак, поочередно, вы можете throw что-то, что позволит вам распознать, что модал закрыт, и ничего не делать в этом случае;в противном случае перейдите к обработке исключения.

prompt.CLOSE_SIGNAL = Symbol('prompt.CLOSE_SIGNAL');

prompt('Enter a value.')
.then(/* ... */)
.catch(ex => {
    if (ex === prompt.CLOSE_SIGNAL) return;

    // Otherwise:
    console.error('Error from modal:', ex);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...