Nano Hash - криптовалюты, майнинг, программирование

Как обработать «Возможно необработанный отказ: фоновый клик» в общем виде

У меня есть служба angular для обработки модальных окон:

angular.module('myApp').service('ModalService', function($uibModal) {
  function open(options) {
    return $uibModal.open(options);
  }
});

Теперь я обновился до angular 1.6 и получил эту ошибку:

Возможно необработанный отказ: щелчок в фоновом режиме

всякий раз, когда я открываю модальное окно и нажимаю где-нибудь еще (фон), модальное закрывается (как и предполагалось). Итак, я хочу обрабатывать этот unhandled exception в моем ModalService, так как я не хочу обрабатывать этот случай каждый раз, когда использую ModalService. Всегда можно закрыть модальное окно с помощью фонового клика, это не исключение.

Я старался:

angular.module('myApp').service('ModalService', function($uibModal) {
  function open(options) {
    var modalInstance = $uibModal.open(options);
    modalInstance.result.catch(function error(error) {
      if(error === "backdrop click") {
        // do nothing
      } else {
        throw error;
      }
    })
    return modalInstance;
  }
});

Но это приводит к тому, что я не могу обрабатывать другие ошибки, кроме backdrop click, так как они всегда выдаются:

ModalService.open({...}).result.catch(function(error) {
  // this will catch the error too, but the throw in the ModalService
  // will occure in parallel and will not be catched by this function
});

А если я попробую так:

angular.module('myApp').service('ModalService', function($uibModal) {
  function open(options) {
    var modalInstance = $uibModal.open(options);
    modalInstance.result.then(function(whatever) {
      return whatever;
    }, function rejection(error) {
      return error;
    });
    return modalInstance;
  });
});

он устраняет ошибку «необработанный отказ», но для каждого случая, а не только для «щелкнутого фона».

Есть ли у кого-нибудь хорошее решение для этого случая?


Ответы:


1

К сожалению, именно так они обрабатывают это в официальном Plucker для Modal (ui.bootstrap.modal).

Если вы нажмете на любую кнопку, в журнале появится что-то вроде этого:

Модальный режим закрыт в: четверг, 23 февраля 2017 г., 21:54:26 GMT-0300 (тихоокеанское летнее время Южной Америки)

Что они делают:

modalInstance.result.then(function (selectedItem) {
  $ctrl.selected = selectedItem;
}, function () {
  $log.info('Modal dismissed at: ' + new Date());
});

Если вы удалите обратный вызов ошибки, угадайте, что вы получите:

Возможно необработанный отказ: щелчок в фоновом режиме

И даже при отмене

Возможно необработанный отказ: отменить

Пока вы либо делаете это, либо используете этот обходной путь, чтобы заглушить необработанные отказы.

app.config(['$qProvider', function ($qProvider) {
            $qProvider.errorOnUnhandledRejections(false);
        }]);
24.02.2017
  • Ммм, так что все, что я могу сделать, это заглушить ошибку с помощью конфигурации или перехватить их все и проглотить? Это не удовлетворяет... 24.02.2017
  • Я согласен. Но так ведет себя ядро. По крайней мере (надеюсь) до 1.6.2. См. github.com/angular/angular.js/issues/ 24.02.2017
  • Вы не должны замалчивать ошибку, а вместо этого обрабатывать отклоненное обещание вторым аргументом then. 22.03.2017

  • 2

    использовать этот

     $uibModal.open({
                        ////your code......
    }).result.then(function(){}, function(res){})
    

    теперь он не выдаст вам ошибку

    05.05.2017
  • Я не хочу обрабатывать этот случай каждый раз, когда использую ModalService. 07.05.2017
  • но это проблема angularjs, если вы будете использовать app.config(['$qProvider', function ($qProvider) { $qProvider.errorOnUnhandledRejections(false); }]); тогда многие ошибки не будут обрабатываться 11.05.2017

  • 3

    Если вы используете контроллер в своем модальном окне. Я использовал это на заключительном мероприятии. Потому что «Закрытие» допустимо, а «Отклонение» — это отклонение. Это происходит внутри вашего модального контроллера, а не родителя.

                $scope.$on('modal.closing', (event, reason, closed) => {
                    if (!closed) {
                        event.preventDefault();
                        $scope.$close("Closing");   
                    }
    
                });
    

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

    08.09.2017

    4
  • Поскольку я хочу, чтобы пользователь мог щелкнуть фон, чтобы закрыть модальное окно, это не решение (как вы уже указали во введении). 16.05.2017
  • Спасибо, это полезно для меня. У меня есть и кнопка закрытия, и X, чтобы закрыть окно, поэтому для моего конкретного случая было бы лучше не позволять пользователю нажимать на фон. 07.01.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..