我了解无限循环的基本概念以及如何发生,但我遇到了问题。这里是一个演示我的代码和问题的 fiddle:http://jsfiddle.net/eS5e5/1/。在 jsfiddle 控制台中,您将看到无限循环。
基本上,我必须根据可能尚未加载的数据做出决策,因此我需要使用 then() 等待 promise 解析。我有一个名为 user 的 promise。代码中有两个不同的地方调用 user 的 then()。
1. 定义后。我需要基于它设置作用域变量。 2. 在另一个作用域方法 $scope.isAdmin() 中。
对于第二点,可能会问为什么我不直接在 $scope.isAdmin() 方法中使用 $scope.user。问题是,$scope.isAdmin() 可能会在异步请求 user 返回之前被调用,在这种情况下,我需要在从 $scope.isAdmin() 返回之前“阻塞”。
我的问题是,$scope.isAdmin() 的哪个部分让 angular 认为已更改了'被观察' 的变量,并且需要重新运行 digest cycle? $scope.isAdmin() 实际上没有改变任何内容。
以下是简化后的代码:
HTML:
基本上,我必须根据可能尚未加载的数据做出决策,因此我需要使用 then() 等待 promise 解析。我有一个名为 user 的 promise。代码中有两个不同的地方调用 user 的 then()。
1. 定义后。我需要基于它设置作用域变量。 2. 在另一个作用域方法 $scope.isAdmin() 中。
对于第二点,可能会问为什么我不直接在 $scope.isAdmin() 方法中使用 $scope.user。问题是,$scope.isAdmin() 可能会在异步请求 user 返回之前被调用,在这种情况下,我需要在从 $scope.isAdmin() 返回之前“阻塞”。
我的问题是,$scope.isAdmin() 的哪个部分让 angular 认为已更改了'被观察' 的变量,并且需要重新运行 digest cycle? $scope.isAdmin() 实际上没有改变任何内容。
以下是简化后的代码:
HTML:
<body ng-controller='myController'>
<div ng-if='isAdmin()'>Hi! <strong>{{ user.username }}</strong> is an Admin!!!</div>
<div ng-if='!isAdmin()'>Hi! <strong>{{ user.username }}</strong> is NOT an Admin!!!</div>
</body>
以下是JS代码:
angular.module('myApp', [])
.factory('myService', function($q, $timeout) {
return {
getUser: function() {
var deferred = $q.defer();
$timeout(function() {
deferred.resolve({ username: 'me', isAdmin: true });
}, 2000);
return deferred.promise;
}
};
})
.controller('myController', function($scope, $q, myService) {
var getUserDeferred = $q.defer();
var user = getUserDeferred.promise;
user.then(function(user) {
$scope.user = user;
return user;
});
$scope.getUser = function() {
return myService.getUser().then(function(user) {
getUserDeferred.resolve(user);
});
};
$scope.isAdmin = function() {
return user.then(function(user) {
return user.isAdmin;
});
};
$scope.getUser();
});
但是在我的代码中,我是[... ]
,它只返回一个新的Promise(由于返回值不断变化而使应用程序循环无限进行)。 - keithl8041