gpt4 book ai didi

如果周期性 $rootScope.$digest 生效,AngularJS $http.post 响应激活得更快

转载 作者:行者123 更新时间:2023-12-04 21:42:59 31 4
gpt4 key购买 nike

在我们非常庞大且非常复杂的 AngularJS 应用程序中,我注意到(偶然!)我的主模块设置中有这样一行...

application.run(function($rootScope) {
window.setInterval( () => { $rootScope.$digest(); }, 1000);
});

...对我们的 $http.post 请求的激活时间有显着的积极影响。

确定性地再现行为的一小部分代码是这样的:
// In the partial
<button ... ng-click="buttonHandler" ...>

// In the controller
$scope.buttonHandler = function() {
$http.post(....).success( function() { console.log("Activated"); })
}
  • 我们将按钮的 ng-click 处理程序与调用我们的 Web 服务之一相关联。
  • Web 服务本身会在 30 毫秒内响应(根据 Chrome 开发者工具)。
  • 但是,.success 中的代码处理程序在 1.75 - 2.3 秒后执行(然后控制台中才会显示消息“已激活”)。

  • 然而,当我们将 Eternal rootScope $digest Hack (TM) 安装到位时,激活会在不到一秒的时间内发生! :-)

    我只能猜测 rootScope $digest 以某种方式“触发”了 .success 处理程序的实际调用,并且由于 Web 服务本身在 30 毫秒内响应,因此激活时间取决于按钮按下何时恰好落在hack 的 setInterval。

    我并不是说这是一种推荐的做法——但我很惊讶地看到它发生了。请注意,在我的断言检查中的任何地方都没有记录控制台错误或报告任何其他恶作剧 - 无论有没有黑客攻击,代码都可以正常工作,但当黑客攻击到位时,性能会显着提高。

    知道发生了什么吗?

    最佳答案

    Angular 中的 Promise 使用 $rootScope.$evalAsync(callback) 排队回调.

  • 回调检查 promise 是否已被解决/拒绝。
  • $evalAsync安排任务在下一个摘要周期完成后运行。

  • 因此,如果您先发制人地要求一个摘要周期,您的 promise 可能会更快地得到解决。

    来源: https://github.com/angular/angular.js/blob/master/src/ng/q.js#L175

    关于如果周期性 $rootScope.$digest 生效,AngularJS $http.post 响应激活得更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21702594/

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