Невозможно установить свойство pur для undefined

Я использую angular с bluebird и угловатые-синие-обещания, чтобы переопределить встроенное обещание Angular. После обновления до angular v1.6.5 при вызове $ interval.cancel накапливается исключение. Я проверил более раннюю версию angular, и был добавлен следующий код:

function markQStateExceptionHandled(state) {
  state.pur = true;
}
function markQExceptionHandled(q) {
  markQStateExceptionHandled(q.$$state);
}

проблема в том, что обещание bluebird не имеет атрибута состояния $$ и генерируется исключение:

> TypeError: Cannot set property 'pur' of undefined
>         at markQStateExceptionHandled (angular.js?3437:17654)
>         at markQExceptionHandled (angular.js?3437:17657)
>         at Function.interval.cancel (angular.js?3437:13650)
>         at eval (ng-infinite-scroll.js?6418:180)
>         at callback (angular.js?3437:13629)
>         at Scope.$digest (angular.js?3437:18515)
>         at Scope.$apply (angular.js?3437:18903)
>         at tick (angular.js?3437:13619)

Я не уверен, где находится приведенный выше код, но в качестве временного взлома вы можете сделать Promise.prototype.$$state = {}, с которым bluebird будет в порядке

Benjamin Gruenbaum 07.05.2018 10:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
122
1

Ответы 1

Это ошибка в Angular.js. Существует пул реквест, чтобы исправить это, изменив код, чтобы проверить наличие $$state:

function markQStateExceptionHandled(state) {
  if (state) {
    state.pur = true;
  }
}

Срок выхода 1.6.10. А пока вы можете исправить это со стороны Bluebird, выполнив:

Promise.prototype.$$state = {};

Я могу пообещать, что он ничего не испортит со стороны bluebird и не будет иметь слишком много недостатков, кроме уродливого взлома.

Спасибо за быстрый ответ. При добавлении этой строки срабатывает необработанное событие отказа. Я думаю, это из-за отмененного обещания

Michal Dan 07.05.2018 10:43

Другие вопросы по теме