【问题标题】:promising response from angular forEach which is having $timeout within it来自 Angular forEach 的有希望的响应,其中包含 $timeout
【发布时间】:2016-12-27 07:16:50
【问题描述】:

我有一个 html 按钮,必须根据范围变量启用或禁用。我根据条件为每个分配启用/禁用操作。对于这种情况,我需要$timeout

vm.isDisable = true;//disbles the button before forEAch
//vm.gridData, which is array  of object haves more than 1000 rows
  angular.forEach(vm.gridData,function(rows){ 
     if(rows.isSelectedRow == true) { 
        $timeout(function(){ 
            vm.gridApi.selection.selectRow(rows); 
         }) 
    });
  vm.isDisable = false; //enables the button after for each

但在 for each 完成之前启用按钮,因为 forEach 中的$timeout。如何在 forEach 期间禁用按钮并在迭代后重新启用它。

【问题讨论】:

    标签: angularjs foreach timeout


    【解决方案1】:

    您应该使用带有all 方法的承诺:

    var promises = [];
    vm.isDisable = true;
      angular.forEach(vm.gridData,function(rows){ 
         if(rows.isSelectedRow == true) { 
    
            var deferred = $q.defer();
            promises.push(deferred.promise);
    
            $timeout(function(){ 
                vm.gridApi.selection.selectRow(rows); 
                deferred.resolve();
             }) 
        });
    $q.all(promises).then(function(){
        vm.isDiable = false;
    });
    

    【讨论】:

      【解决方案2】:

      $timeout 返回一个承诺,因此您可以创建一个包含这些承诺的数组并在它们全部解决后启用按钮

      var promises = vm.gridData.reduce(function(a, c) {
        if (c.rows.isSelectedRow == true) {
          a.push($timeout(function() {
            return vm.gridApi.selection.selectRow(c.rows);
          }));
        }
        return a;
      }, []);
      
      
      $q.all(promises).then(function(){
          vm.isDiable = false;
      })
      

      【讨论】:

        猜你喜欢
        • 2017-10-21
        • 1970-01-01
        • 1970-01-01
        • 2022-12-29
        • 1970-01-01
        • 2014-03-30
        • 2016-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多