Debounce 值但 return 所有非唯一元素而不是 javascript 中的一个元素

Debounce values but return all non unique elements instead of just one element in javascript

我有一个用例,我有多个函数同时触发。 每个函数都可以调用多次,但我只需要选择一个 return 值。我正在使用 debounce,它确实按预期工作。即使我有 10 个 return 值,最后我也只得到 1 个 return。但是,如果有唯一值,我想要所有唯一值 returned

发生了什么

-----1----2-----2---2----2----2----3-----3---3---3---3---3------>
(Only 1 value is returned)
-------------------3--------------------------------------------->

我想要的

-----1----2-----2----2----2----2----3-----3---3---3---3---3------>
(Return all unique values)
-------------------1-------------------2--------------------3---->

我尝试过的(示例)

var _ = require('lodash');

function printOne () {
  handleDebounce(1);
}

function printTwo () {
  handleDebounce(2);
}

function printThree () {
  handleDebounce(3);
}


const handleDebounce = _.debounce((msg) => {
  console.log(msg)
}, 2000, );


printOne();
printTwo();
printTwo();
printTwo();
printThree();
printThree();
printThree();

输出 -> 3

预期输出 -> 1 2 3

我是否应该使用集合来具有本地缓存​​的形式,然后获取唯一值?欢迎任何指点

您可以跟踪传递给函数的所有参数。您可以在嵌套查找映射中执行此操作,其中每个嵌套级别都与下一个参数有关(以防传递多个参数)。一个特殊的 end-symbol 表示嵌套 Map 中的一个参数是最后一个参数——以区分传递相同参数但后面有一些额外参数的情况。

这是如何实现的:

function withUniqueArguments(func, delay=50) {
    const end = Symbol("end"); // A unique value only known here
    const map = new Map; // Stores all argument references used before
    
    function testAndSetArgs(args) {
        let node = map;
        for (const arg of args) {
            let res = node.get(arg);
            if (res === undefined) node.set(arg, res = new Map);
            node = res;
        }
        let found = node.get(end);
        if (!found) node.set(end, true);
        return !!found;
    }
    
    return function wrapper(...args) {
        if (testAndSetArgs(args)) return; // Function was called with these arguments before
        setTimeout(() => func.call(this, ...args), delay);
    };
}

const handleSearch = withUniqueArguments(console.log, 50);

handleSearch(1);
handleSearch(2);
handleSearch(2);
handleSearch(2);
handleSearch(3);
handleSearch(3);
handleSearch(3);

免责声明:参数的比较是reference-based,所以如果对象作为参数传递,只有当它们真的是同一个对象时才会被认为是相同的,而不是它们的副本。此外,当一个对象在调用之间发生变化,并再次作为参数传递时,它仍将被视为同一个对象,因此不会进行第二次调用。

如果您需要复制的对象被认为是相同的,而变异的对象被认为是不同的,那么您需要包含一个 deep-object-comparison 函数。