Мы находимся в процессе обновления проекта 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