【问题标题】:Can I pass parameters to a function debounced with _.lodash?我可以将参数传递给使用 _.lodash 去抖动的函数吗?
【发布时间】:2014-02-02 08:12:33
【问题描述】:

我一直在尝试使用 _lodash.debounce() 并且可以正常工作。然而我是 不确定它是否以最好的方式工作。我查看了 lodash 网站上的示例,它们似乎只是不传递参数的简单示例。这是我所拥有的:

$scope.parsePid = _.debounce(function () {
    $scope.$apply(function () {
        var pid = $scope.option.sPidRange;
        if (pid == null || pid === "") {
            $scope.pidLower = null;
            $scope.pidUpper = null;
        }
        else if (pid.indexOf("-") > 0) {
            pid = pid.split("-");
            $scope.pidLower = parseInt(pid[0]);
            $scope.pidUpper = parseInt(pid[1]);
        }
        else {
            $scope.pidLower = parseInt(pid);
            $scope.pidUpper = null;
        }
    });
}, 1500);

上面的代码返回一个去抖动的函数$scope.parsePid。请注意,4日 我得到$scope.option.SPidRange 的值并在函数中使用它。我真的很想以某种方式传入这个参数,而不是这样获取。

我这样调用函数:

$scope.$watch("option.sPidRange", function (pid) {
    if (pid !== null) {
        $scope.parsePid();
    }
});

这里pid的值应该等于$scope.parsePid

我想将这个 pid 值传递给去抖动函数,但我不确定 这个怎么做。我尝试了一些不同的东西,但去抖动功能给出了一个 错误。

是否可以将参数传递到去抖动的function $scope.parsePid() 中?

【问题讨论】:

  • $ 符号是什么?

标签: javascript angularjs lodash


【解决方案1】:

更新

您应该将参数传递给函数:_.debounce(function (pid) {

An example with debounce

$scope.parsePid = _.debounce(function(pid){
  $scope.$apply(function(){
    if (pid === null || pid === "") {
      $scope.pidLower = null;
      $scope.pidUpper = null;
    } else if (pid.indexOf("-") > 0) {
      pid = pid.split("-");
      $scope.pidLower = parseInt(pid[0],10);
      $scope.pidUpper = parseInt(pid[1],10);      
    } else {
      $scope.pidLower = parseInt(pid,10);
      $scope.pidUpper = null;
    }      
  });
},1500);

我会使用内置的 $timeout

An example with $timeout

var promise;

$scope.parsePid = function(pid){
  $timeout.cancel(promise);
  promise = $timeout(function(){     
    if (pid === null || pid === "") {
      $scope.pidLower = null;
      $scope.pidUpper = null;
    } else if (pid.indexOf("-") > 0) {
      pid = pid.split("-");
      $scope.pidLower = parseInt(pid[0],10);
      $scope.pidUpper = parseInt(pid[1],10);      
    } else {
      $scope.pidLower = parseInt(pid,10);
      $scope.pidUpper = null;
    }
  },1500);
};

【讨论】:

  • 谢谢。我将 if {} 包装在 $scope.$apply() 和最后使用 $scope.$apply() 之间有区别吗?
  • 其实你应该把它包装在$scope.$apply(function(){})里面。我只是做了它,这样看起来会更清楚。阅读:$scope.$apply() vs $scope.$apply(fn)
  • 这真的有效吗?我试图做类似的事情,但它的作用就像调用的函数是_.delayed 而不是_.debounced。每次调用$scope.parsePid 时,它不会创建一个新的去抖动函数然后调用该新函数而不是旧函数实例吗?仅当您将函数包装一次,然后多次调用该实例时,去抖动才有效。 (或者也许发生了一些 IIFE 魔法使这项工作有效,我完全错过了重点。)
  • 我相信有参数的去抖动函数存在潜在的重大问题。也就是说,想象一下快速连续调用:$scope.parsePid(1);$scope.parsePid(2);$scope.parsePid(1); 应用程序是否应该只解析 pid 1?还是应该在单独的去抖动队列中解析 pid 1 和 2?这是我最近在我创建的代码中发现的一个类似问题(使用参数去抖动)。
  • @ryanm 这确实是个问题,但在某些情况下这并不重要。我正在研究一种情况,几乎可以肯定地保证在我为它定义的微小间隔(250 ms)内使用相同的参数调用 debounce 方法,并且如果用户设法从模块的另一部分调用它不同的参数,它仍然不是世界末日。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2014-02-15
  • 2011-01-10
相关资源
最近更新 更多