1
所以,我想知道爲什麼我看到這種特殊的行爲。我不知道如果我不明白的東西有關的承諾是如何工作的,或JavaScript,或棱角分明,但在這裏發生了什麼(我有這個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>
我需要從承諾中返回的內容中獲得價值。我認爲最簡單的方法是通過分配承諾對象之外的東西。如果你看一下plnkr,你會看到我通過賦值給$ scope變量或者使用angular.copy()成功獲取值。但是,我不能直接將其直接賦值給defReuse()函數中返回的變量,這很奇怪。我應該在這裏添加我已經聲明瞭我想要在全局範圍中分配的toBeRet變量以及相同的結果。
那麼,問題是爲什麼呢?有什麼我忽略了$ scope變量?或者Angular如何工作?或承諾如何工作?目前有點神祕......
答應到時候defReuse()執行,並返回toBeRet的toBeRet是空的。由於異步請求在後臺不完整並且需要時間來填充toBeRet。 – Vivek
@VVK這個答案的唯一問題是,如果我將全局範圍中的變量更改爲全局變量,並且只是指定但不返回,那麼賦值仍然不會發生。另外,因爲toBeRet在這方面是一個對象,所以應該引用它?所以,當承諾確實解決它應仍然分配給對象,並以這種方式到$ scope.testing變量,正確? –
看着plnkr。它顯示正確的結果。你推遲的成功函數返回** funk:「yes」**。並且您正在打印** testing.funk ** – Vivek