所以,我想知道为什么我会看到这种特殊的行为。我不确定我是否不了解promise、JavaScript或Angular是如何工作的,但以下是正在发生的事情(我设置了这个plnkr来演示-http://plnkr.co/edit/ZKXkUv?p=preview):
<html ng-app="queue">
<head>
<title>$q resolves for no one</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular-resource.js"></script>
<script>
angular.module('queue', ['ngResource'])
.controller('queueCtrl', ['$scope', '$q', function($scope, $q)
{
var _funk = true;
$scope.testing2;
var deferred = $q(function(resolve, reject)
{
if (_funk) {
resolve({funk: 'yes'});
} else {
reject({funk: 'no'});
}
});
deferred.then(function(resolved){
console.log(resolved.funk)
}, function(rejected){
console.log(rejected);
})
function defReuse()
{
var toBeRet = {};
deferred.then(function(resolved){
console.log('yea')
$scope.testing2 = resolved;
angular.copy(resolved, toBeRet);
}, function(rejected){
toBeRet = rejected;
})
return toBeRet;
}
$scope.testing = defReuse();
}]);
</script>
</head>
<body ng-controller="queueCtrl">
{{testing.funk}}
{{testing2.funk}}
</body>
</html>
我需要从承诺中得到回报。我认为最简单的方法是分配给promise对象之外的对象。如果你查看plnkr,你会发现我通过赋值给$scope变量或使用angular.copy()成功地获得了值。然而,我不能成功地直接赋值给defReuse()函数中返回的变量,这很奇怪。我应该在这里补充一点,我已经在全局范围内声明了我试图分配给的toBeRet变量,并得到了相同的结果。
所以,问题是为什么?$scope变量是否存在我忽略的地方?或者Angular是如何工作的?或者承诺是如何运作的?目前这有点神秘。。
$q
帮助我们异步运行函数。这个返回promise,一旦它解析了相应的then
方法,就会被调用。请通过以下链接了解$q和angular 中的承诺
- https://docs.angularjs.org/api/ng/service/$q
- http://chariotsolutions.com/blog/post/angularjs-corner-using-promises-q-handle-asynchronous-calls/