【问题标题】:AngularJS 1.2.26 $scope asynchronous function performs digest cycle errorAngularJS 1.2.26 $scope 异步函数执行摘要循环错误
【发布时间】:2015-08-22 16:40:21
【问题描述】:

我需要在作用域中有一个函数,它的结果会异步改变。

必须有一个函数用作表达式,所以我不能使用单个属性。

在我的示例中,该函数返回一个对象的属性,该属性将被异步修改。尽管该值在整个摘要周期内相等,但这会执行摘要错误。 这里的例子: http://plnkr.co/edit/YmyroMiMyMzUaLW4tc7V(注意:它可能会挂起你的浏览器)

myApp.controller('Ctrl1', ['$scope', '$http',  function($scope, $http) {
    var myObj = {found:false};
    $scope.util = {};

    $scope.util.asyncFunc = function(){

      $http.get('http://localhost').then(changeValue,changeValue);

      return myObj.found;
    }

    function changeValue(){
      myObj.found = true;
    }
}]);

知道怎么解决吗?

【问题讨论】:

  • 这是一个异步函数吗?它会返回 false.... 但 2 秒后它会将对象引用 myObj.found 更改为 true。为了使它异步,从它返回一个$promise
  • 你能展示控制器代码是如何在模板中使用的吗?什么是绑定的?
  • 你简直就是在杀人。每个$timeout 都会导致$digest() 和每个$digest() 重新评估所有角度表达式,这会导致另一个`$timeout 用于您的案例等等。这意味着它只会达到$digest() 迭代次数
  • @Samir,你是完全正确的。 '$timeout' 会导致 '$digest()'。好吧,在我真正的问题中,我所做的是一个“$http.get”,我也有同样的问题。
  • 我在问题和 plunkr 示例中用 $http.get 更改了 $timeout:plnkr.co/edit/YmyroMiMyMzUaLW4tc7V,那么,你有一个很好的方法来实现它的例子吗?也许有承诺?

标签: javascript angularjs asynchronous


【解决方案1】:

我有一个解决方案,问题是一直执行 $http.get,它会创建将同时解决的承诺。所以,首先我通过检查 promise 是否已经创建来解决问题。之后,在 promise 的回调中,我将控制是否创建 promise 的 var 设置为 null,但我重新定义了函数,执行一种返回相同值的桥接,以避免在相同的 $digest 中执行 $http.get: http://plnkr.co/edit/LOXDzVC4do2GTRtyNgSU

var myApp = angular.module('myApp', []);
//nueva 2015-06-09
myApp.controller('Ctrl1', ['$scope', '$http', '$q', function($scope, $http, $q) {
    var myObj = {found:false};
    $scope.util = {};
     var pro;
    $scope.util.asyncFunc = doGet;



    function doGet(param1, param2){
      if(!pro){
        pro = $http.get('http://localhost').then(changeValue,changeValue);
      }

      return myObj.found;

      function changeValue(){
        if(param1 !== "2"){
          myObj.found = true;
        }else{
          myObj.found = false;
        }


        $scope.util.asyncFunc = function(param1, param2){
          $scope.util.asyncFunc = doGet;
          pro = null;

          return myObj.found;
        }
    }
    }
}]);

和html:

<body>
    <div ng-controller="Ctrl1">
          <br/><br/>
          Param1:<input type="text" ng-model="model.param1" />
          Param2:<input type="text" ng-model="model.param2" />

        AsyncFunc: {{util.asyncFunc(model.param1, model.param2)}}
    </div>

    <script src="http://code.angularjs.org/1.2.26/angular.js"></script>
    <script src="script.js"></script>
  </body>

好吧,我认为这肯定不是最好的解决方案,如果您有其他方法会非常有帮助。

【讨论】:

  • 这里的另一个难看的问题是,当我们更改输入值时,http get 会执行 2 次。
猜你喜欢
  • 2015-06-11
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 2018-04-02
  • 2020-03-07
  • 2016-05-20
  • 2013-10-17
  • 1970-01-01
相关资源
最近更新 更多