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 函数。
我有一个用例,我有多个函数同时触发。 每个函数都可以调用多次,但我只需要选择一个 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 函数。