$http在什么时候触发摘要循环开始

At what point does $http trigger the digest cycle to start?

本文关键字:循环 开始 http 什么时候      更新时间:2023-09-26

我的假设是,它发生在.success回调完成执行之后。与相反

  • .success回调完成运行之前
  • 请求发出后立即发送

考虑这个代码:

notes.service.js

angular.module('notes').service('notes', ['$http', 
function($http) {
    var obj = {};
    this.getNotes = function() {
        $http.get('/notes').success(function(notesResponse) {
            obj.notes = notesResponse;
        });
        return obj;
    };
}]);

notes.controller.js

angular.module('notes').controller('NotesCtrl', ['notes', 
function(notes) {
    /* 
        $scope.$$watchers = [
            'notesCtrl.obj', cb
        ];
    */
    this.obj = notes.getNotes();    
}]);

list.html

<div class='page-header'>
    <h1>List of Notes</h1>
</div>
<ul>
    <li ng-repeat='note in notesCtrl.obj.notes track by note.id'>{{note | json}}</li>
</ul>

想象一下,GET请求需要一个小时才能发送回响应。

  • 该服务将发回CCD_ 3
  • 在控制器中,this.obj将被设置为{}
  • 在视图中,notesCtrl.obj.notes将是undefined,因此不会发生ng-repeat
  • 一个小时后,当回复回来时。。。它会更新该对象。服务指向它,控制器指向它,视图指向它。所以它们都被"更新"了(实际上是对象被更新了;指针不会改变,所以它们并没有真正被"更新")
  • 响应触发.success的回调,后者进行更新,一旦.success的回调完成,就会启动摘要循环
  • 摘要循环看到notesCtrl.obj发生了变化,因此运行相应的回调,从而更新DOM

这是正确的吗?

此外,$http触发$digest还是$apply?如果它触发$digest,它如何知道调用哪个$scope?例如,服务中的$http$scope没有关联(是吗?)。

这是最正确的:在摘要周期中,成功回调实际上被称为。如果你尝试以下,你可以看到这一点

$http.get('test.json').success(function(result) {
  $scope.$apply();
});

然后(假设GET到test.json成功),Angular将抛出一个可以在控制台中看到的错误:

 Error: [$rootScope:inprog] $digest already in progress

这可以在http://plnkr.co/edit/wj4z1hDRXtK2GJnrkKuV?p=preview

另外,$http触发$digest还是$apply?

$apply,因为它确实不知道需要检查哪些作用域,所以它触发一个全局摘要来检查所有作用域。

我查看了$http的文档(行:1083)在下方找到这条线

/**
*回调已注册到$httpBackend():
*-根据需要缓存响应
*-解析原始$http承诺
*-调用$apply
*/

它说回调被注册到$httpBackend(),如果需要,它会按照缓存响应的顺序执行以下操作(取决于你在$http中提供true,它会缓存它)。然后它根据响应解析$httppromise,这意味着调用成功或错误(也可以是Then())。然后它最终调用$apply来执行摘要循环。

据我从文档中了解到,$http服务绑定了$rootScope。

如果你在想,如果$apply在它之后启动,那么文档本身$rootScope中就是答案$始终运行的applySync并解析httppromise,然后在此$rootScope之后解析$apply()运行。(线路:1102-1106)

希望这能消除你的疑虑。

相关文章: