【问题标题】:AngularJS $q and promises and assignment confusionAngularJS $q 和 promises 和赋值混淆
【发布时间】: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


【解决方案1】:

$q in angular 帮助我们异步运行函数。这个返回承诺,一旦它解决了相应的then 方法,就会被调用。请通过以下一些链接了解 $q 和 angular 中的 promise

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2012-08-18
    • 2016-03-05
    • 1970-01-01
    • 2017-08-24
    • 2020-12-04
    • 2014-07-03
    相关资源
    最近更新 更多