Обещания Обнаружения Угловых Изменений - Гибридное приложение - PullRequest
0 голосов
/ 11 января 2019

Мы находимся в процессе обновления проекта AngularJS до Angular 7. Мы следуем предложенному «гибридному» подходу, в котором обе платформы работают бок о бок. Мы сталкиваемся с некоторыми проблемами обнаружения изменений с собственными обещаниями. По сути, служба AngularJS (Служба A) использует «пониженную» службу Angular 7 (Служба B). Перед миграцией все методы ServiceB возвращали $ q defer.promise. Однако теперь, когда Сервис B является сервисом Angular 7, мы возвращаем обычные Обещания, но это не очень хорошо работает с Обнаружением изменений.

Я попытался обернуть вызов SerivceB в обещание $ q и теперь вижу, что он работает нормально. Однако это нереальное решение, так как ServiceA будет обновлен до сервиса Angular 7 в будущем.

Текущий код

ServiceA.get = function(order) {
    //do some work
    //ServiceB is the downgraded Angular 7 service
    //now returns a native promise

   return ServiceB.getOrders(order) 
}

ServiceA.processBatch = function(order,observer) {
    ServiceA.get(order)
    .then(function(resolve) {
        //should trigger the UI update in the Controller (still Angular JS)
        observer.onComplete(resolve)
    })
    .catch(function(err) {
        observer.onError(err)
    })
}

Теперь становится интересно, когда я заключаю вызов ServiceB getOrders в задержку $ qs, потому что тогда пользовательский интерфейс обновит

ServiceA.get = function(order) {
        //do some work
        //ServiceB is the downgraded Angular 7 service
        //now returns a native promise
       var defer = $q.defer()
       ServiceB.getOrders(order)
          .then(function(resolve) { defer.resolve(resolve)})
          .catch(function(err) { defer.reject(err);}); 

       return defer.promise;
}

Я ожидаю, что не будет никакой разницы, но при проверке стека вызовов я вижу, что обычное разрешение обещаний выполняется внутри зоны, но при использовании $ q я вижу, что следует $ digest.

Я не понимаю, почему это так. Это упрощенный пример кода. На самом деле происходит больше, поэтому я не могу вернуть обещание от processBatch

1 Ответ

0 голосов
/ 15 января 2019

Я обнаружил проблему после нескольких плохих дней в офисе. Проблема заключалась в том, что ServiceA использовала стороннюю библиотеку. ServiceA зависел от некоторых обратных вызовов этой сторонней библиотеки, когда бы они ни выполнялись, я больше не находился в «угловой» зоне. Я был в "" зоне. Мой вопрос был плохо сформулирован, и мой тупой код не включал часть о сторонней библиотеке. Мораль этой истории состоит в том, чтобы проверить стек вызовов, чтобы определить, нахожусь ли я в угловой зоне или в «корневой» зоне. Если вы находитесь в корневой зоне, это, вероятно, связано со сторонней библиотекой, которая использует события, которые не были обезьяны исправлены Angular

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