2015-11-20 146 views
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如何工作?或承諾如何工作?目前有點神祕......

+0

答應到時候defReuse()執行,並返回toBeRet的toBeRet是空的。由於異步請求在後臺不完整並且需要時間來填充toBeRet。 – Vivek

+0

@VVK這個答案的唯一問題是,如果我將全局範圍中的變量更改爲全局變量,並且只是指定但不返回,那麼賦值仍然不會發生。另外,因爲toBeRet在這方面是一個對象,所以應該引用它?所以,當承諾確實解決它應仍然分配給對象,並以這種方式到$ scope.testing變量,正確? –

+0

看着plnkr。它顯示正確的結果。你推遲的成功函數返回** funk:「yes」**。並且您正在打印** testing.funk ** – Vivek

回答