简体   繁体   English

Javascript:如何调整反跳功能以采用IF条件?

[英]Javascript: How do I tweak my debounce function to take an IF conditional?

I found a bug, and tracked it down. 我发现了一个错误,并对其进行了跟踪。
You can see a simplified example of my code here . 您可以在这里看到我的代码的简化示例

As it turns out, I need to debounce my if() statement rather than debouncing the function itself. 事实证明,我需要对if()语句进行反跳操作,而不是对函数本身进行反跳操作。
I'd like to keep the debounce as a standalone function, but I'm not sure then how to pass the conditional in. 我想将反跳功能保留为独立功能,但不确定如何传递条件输入。

Any pointers? 有什么指针吗?

Here's the code: 这是代码:

var foo = function(xyz) {
    alert(xyz);
};

function setter(func, arg1, arg2) {
    return {
        fn: func,
        arg1: arg1,
        arg2: arg2
    };
}

function debounce(someObject) {
    var duration = someObject.arg2 || 100;
    var timer;
    if (timer) {
        clearTimeout(timer);
    }
    timer = setTimeout(function() {
        someObject.fn(someObject.arg1);
        timer = 0;
    }, duration);
}

var toggle = true;

if (toggle) {
    debounce(setter(foo, 'The best things in life are worth waiting for.', 1250));
} else {
    foo('Instant gratification is sweet!!');
}

Using your example, why not pass toggle in as arg 1... something like: 以您的示例为例,为什么不以arg 1的形式传递切换...类似于:

var toggle = true;
var debouncedFunk = function(toggle) {
  if (toggle)
    // the function call
  else
    // something else
};
debounce(debouncedFunk, toggle, 1250);

You should also look into using the Function objects .call and .apply methods. 你也应该考虑使用函数对象.call.apply的方法。 They are for calling the function and passing in arguments. 它们用于调用函数并传递参数。 Taking the example function: 以示例函数为例:

var example = function(one, two) { 
  // Logic here
};

You can call it in three ways: 您可以通过三种方式调用它:

// First
example(1, 2);
// Second
example.call({}, 1, 2);
// Third
example.apply({}, [ 1, 2 ]);

The first is the standard way to call a function. 第一种是调用函数的标准方法。 The difference between the first and the .call is that the first parameter to .call is the context object of the function (what this will point to inside the function), the other parameters are passed after that (and a known list is required for .call . The benefit of .apply is that you can pass an array to the function of arguments and they will be assigned to the parameter list appropriately, the first parameter is still the context object. 在第一和之间的差.call在于第一参数.call是函数的上下文对象(什么this将指向函数内),其它参数之后传递(和所需的公知的列表.call 。的好处.apply的是,可以通过数组的自变量的函数,它们将被分配给参数列表适当地,第一个参数是仍然上下文对象。

It would simplify your debounce function, instead of having to deal with a structured object as you currently do. 这将简化您的反跳功能,而不必像当前那样处理结构化对象。

A suggestion for your debounce: 有关防抖的建议:

var debounce = function(funk, delay) {
  var args = [];
  if (arguments.length > 2)
    args = [].slice.call(arguments, 2);
  setTimeout(function() { funk.apply({}, args); }, delay);
};

Changing your current if to: 将您的电流更改为:

var toggle = true;
var debouncedFunk = function(toggle) {
  if (toggle)
    // Do if true
  else
    // DO if false
};
debounce(debouncedFunk, 1000, toggle);

Maybe too much information (sorry)? 也许信息太多(对不起)?

As a last note, I'd recommend using a framework (if possible) where these functions have been implemented already (and many other useful functions) such as Underscore . 最后一点,我建议使用一个框架(如果可能),其中已经实现了这些功能(以及许多其他有用的功能),例如Underscore Using Underscore your example would look like: 使用Underscore,您的示例如下所示:

// Define debouncedFunk and toggle
debouncedFunk = _.bind(debouncedFunk, {}, toggle);
debouncedFunk = _.debounce(debouncedFunk, 1000);
debouncedFunk();

EDIT 编辑

Fixed the underscore example, _.debounce returns a function that will execute only after the delay but it still needs to be called. 修复了下划线示例, _.debounce返回仅在延迟之后执行的函数,但仍需要调用该函数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM