Могу ли я передать параметры функции, для которой отменено дребезг с помощью _.lodash?

Я пытался использовать _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 в функцию debounce, но я не уверен, как это сделать. Я пробовал несколько разных вещей, но функция debounce выдает ошибку.

Можно ли передать параметры в debounced function $scope.parsePid() ?


person Community    schedule 14.01.2014    source источник
comment
Что такое знаки $?   -  person mikemaccana    schedule 15.05.2017


Ответы (1)


ОБНОВИТЬ

Вы должны передать аргумент в функцию: _.debounce(function (pid) {

Пример с устранением дребезга

$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

Пример с $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);
};
person Ilan Frumer    schedule 14.01.2014
comment
Спасибо. Есть ли разница между тем, как я обертываю if {} внутри $scope.$apply() и делаю это с $scope.$apply() в конце? - person ; 14.01.2014
comment
На самом деле вы должны обернуть его внутри $scope.$apply(function(){}). Я просто сделал это, чтобы это выглядело более ясно. прочитайте это: $scope.$apply() против $scope. $применить(fn) - person Ilan Frumer; 14.01.2014
comment
Это действительно работает? Я пытался сделать что-то подобное, но это действует так, как если бы вызываемая функция была _.delayed вместо _.debounced. Каждый раз, когда вызывается $scope.parsePid, не будет ли он создавать новую отмененную функцию, а затем вызывать эту новую функцию вместо старого экземпляра функции? Debounce работает только в том случае, если вы один раз обертываете свою функцию, а затем вызываете этот экземпляр несколько раз. (Или, может быть, происходит какое-то волшебство IIFE, которое заставляет это работать, и я просто полностью упустил суть.) - person Decade Moon; 27.02.2014
comment
Я считаю, что существует потенциальная и серьезная проблема с дебаунс-функциями, у которых есть аргументы. Иными словами, представьте, что вы вызываете в быстрой последовательности: $scope.parsePid(1); $scope.parsePid(2); $scope.parsePid(1); Должно ли приложение анализировать только pid 1? Или он должен анализировать pid 1 и 2 в отдельных очередях устранения отказов? Это проблема, которую я недавно обнаружил в созданном мной коде, который был похож (устранение дребезга с аргументами). - person ryanm; 21.04.2016
comment
@ryanm это действительно может быть проблемой, но в некоторых сценариях это не имеет большого значения. Я работал над случаем, когда метод debounce почти наверняка будет вызываться с тем же параметром в крошечном интервале (250 мс), который я для него определил, и если пользователю удастся вызвать его из другой части модуля с помощью другой параметр, это еще не конец света. - person downhand; 27.01.2017
comment
@downhand Конечно, иногда это не проблема, но если это так, должен быть план. (Хотя эта проблема была некоторое время назад, в итоге я создал версию с отдельными вызовами отката на основе вызываемого параметра.) - person ryanm; 31.01.2017
comment
@downhand В настоящее время я сталкиваюсь с той же проблемой при обновлении записей в таблицах. функция, возможно, вызывается несколько раз с разными параметрами (представьте, что пользователь устанавливает флажки для каждой строки), но отмененная функция будет игнорировать более поздние вызовы. - person coderatchet; 19.09.2017
comment
@coderatchet, конечно, я не знаю размер вашего списка, но если вы используете здесь debounce, в идеале он будет каждый раз сканировать весь список, например _.pluck(_.filter(rows, 'selected') , 'Идентификатор'). Это, безусловно, эффективный и надежный метод для списков размером 10-20. - person downhand; 19.09.2017