【发布时间】:2016-02-22 13:09:00
【问题描述】:
所以,我想知道为什么我会看到这种特殊行为。我不确定我是否不了解 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 返回的内容中获取一个值。我认为最简单的方法是通过赋值给 promise 对象之外的东西。如果您查看 plnkr,您会发现我通过分配给 $scope 变量或使用 angular.copy() 成功地获取了值。但是,我不能成功地直接分配给 defReuse() 函数中返回的变量,这很奇怪。我应该在这里添加,我已经声明了我试图在全局范围内分配的 toBeRet 变量,并且结果相同。
那么,问题是为什么?关于 $scope 变量有什么我忽略的吗?或者 Angular 是如何工作的?或者承诺如何运作?现在有点神秘。。
【问题讨论】:
-
到 defReuse() 执行并返回 toBeRet 时,toBeRet 为空。由于异步请求在后台不完整并且需要时间来填充 toBeRet。
-
@VVK 这个答案的唯一问题是,如果我将 toBeRet 更改为全局范围内的变量并简单地分配但不返回,则分配仍然没有发生。另外,由于 toBeRet 在这种情况下是一个对象,所以应该有对它的引用,对吧?因此,当 promise 确实解决时,它仍然应该分配给对象,并以这种方式分配给 $scope.testing 变量,对吗?
-
通过查看 plnkr。它显示正确的结果。 defer 的成功函数返回 funk: "yes"。你正在打印 testing.funk
-
是的,没错。但是 testing.funk 分配只有在我使用 Angular.copy() 时才会发生,这就是问题 - 为什么会出现这种行为?
标签: javascript angularjs variable-assignment q angular-promise