Uncaught (в обещании) Ошибка - PullRequest
0 голосов
/ 22 мая 2018

Это, очевидно, SSCCE.У меня есть следующее (jsFiddle здесь ):

<html>
  <body>
    <input id='file-dlg' type='file'/>
    <br/>
    <button id='submit' type='button'>submit</button>
    <script>
     document.getElementById('file-dlg').addEventListener('change', storeAPromise);
     var p; 
     function storeAPromise() {
       p = new Promise(function executor(resolve, reject) {
         try {
           throw new Error('snafu');
         } catch(e) {
           reject(e);
         }
       });
     };
     document.getElementById('submit').onclick = function() {
       p.then(function() {}, function reject(e) {
         console.error('some problem happenned', e);
       });
     };
    </script>
  </body>
</html>

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

Тем не менее, это не то, что я наблюдаю.Как только пользователь выбирает файл с диалоговым окном, которое я вижу на консоли:

Uncaught (in promise) Error: snafu(…)

Когда пользователь нажимает кнопку «отправить», я вижу ожидаемую строку журнала «произошла какая-то проблема», но я неНе понимаю, почему я также вижу более раннюю строку журнала «Uncaught (in обещание)», когда пользователь выбирает файл с диалоговым окном файла.Я также не понимаю, почему ошибка описывается как «Uncaught», учитывая, что я перехватываю (безусловно) все исключения и просто вызываю функцию reject.

1 Ответ

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

Это не необъяснимое исключение , это необъяснимое отклонение .Обещания не должны быть висят в отклоненном состоянии без прикрепленного обратного вызова - вот почему консоль предупреждает вас об этом.Вы также можете обрабатывать эти случаи в своем приложении с помощью события unhandledrejection .

Если вы хотите обработать ошибку позже (установите обработчик, когда пользователь нажимает кнопку, что может бытьникогда!), вам все равно нужно будет немедленно установить пустой обратный вызов (который явно игнорирует ошибку), чтобы подавить предупреждение.

var p = Promise.resolve();
document.getElementById('file-dlg').addEventListener('change', function createPromise() {
  p = new Promise(function executor(resolve, reject) {
    throw new Error('snafu');
  });
  p.catch(e => {/* ignore for now */});
});
document.getElementById('submit').addEventListener('click', function addErrorHandler() {
  p.catch(function onReject(e) {
    console.error('some problem happened', e);
  });
});

Обратите внимание, что вам не нужен try / catch- Конструктор обещаний будет перехватывать все исключения от исполнителя по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...