gpt4 book ai didi

javascript - $http 什么时候触发摘要循环开始?

转载 作者:行者123 更新时间:2023-11-29 14:49:05 24 4
gpt4 key购买 nike

我的假设是它发生在 .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 请求需要一个小时才能发回响应。

  • 服务会发回{} .
  • 在 Controller 中,this.obj将设置为 {} .
  • 在 View 中,notesCtrl.obj.notes将是 undefined ,因此 ng-repeat不会发生。
  • 一个小时后,当响应返回时...它会更新该对象。服务指向它, Controller 指向它, View 指向它。所以它们都得到了“更新”(实际上是对象得到了更新;指针没有改变,所以它们并没有真正被“更新”)。
  • 响应触发 .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 看到

Also, does $http trigger $digest or $apply?

$apply,因为它确实不知道需要检查哪些范围,它会触发全局摘要来检查所有范围。

关于javascript - $http 什么时候触发摘要循环开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28796883/

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