gpt4 book ai didi

javascript - Angular Change Detection Promises - 混合应用

转载 作者:太空狗 更新时间:2023-10-29 18:35:57 26 4
gpt4 key购买 nike

我们正在将 AngularJS 项目升级到 Angular 7。我们正在遵循建议的“混合”方法,两个框架并行运行。我们遇到了一些原生 promise 的变更检测问题。本质上,AngularJS(服务 A)服务正在使用“降级”的 Angular 7 服务(服务 B)。在迁移之前,ServiceB 的所有方法都返回 $q 的 defer.promise。然而,既然服务 B 是一个 Angular 7 服务,我们会定期返回 Promise,但这并不能很好地与变更检测配合使用。

我尝试将 SerivceB 的调用包装在 $q promise 中,我发现它现在工作正常。但是,这不是一个可行的解决方案,因为 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 defer 中时,它变得很有趣,因为那样 UI 就会更新

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;
}

我希望没有区别,但在检查调用堆栈时,我发现常规 promise 解析在区域内运行,但在使用 $q 时,我发现遵循了 $digest。

我不明白为什么会这样。这是一个过于简单的代码示例。实际上,还有更多事情正在发生,这就是为什么我无法从 processBatch

返回 promise

最佳答案

我在办公室度过了糟糕的几天后发现了这个问题。问题是 ServiceA 使用的是第三方库。 ServiceA 依赖于第三方库的一些回调,每当这些回调运行时,我就不再处于“Angular ”区域。我在“”区。我的问题陈述不当,我的简化代码不包含关于第三方库的部分。这个故事的寓意是检查调用堆栈,看看我是在 Angular 区域还是“根”区域。如果您在根区域中,则可能是由于第三方库使用的事件不是由 Angular 猴子修补的

关于javascript - Angular Change Detection Promises - 混合应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54138307/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com