使用参数去抖动函数

nic*_*las 7 javascript underscore.js lodash

我正在尝试去除一个save函数,该函数将对象保存为触发时自动保存的参数.去抖动会阻止保存发生,直到用户停止输入,或者至少是这个想法.就像是:

var save = _.debounce(function(obj) {
  ... 
}, delay);
Run Code Online (Sandbox Code Playgroud)

如果我试图快速连续保存两个物体,那么这种情况就会崩溃.因为debounce没有考虑传入的对象,所以只会激活第二次save来调用,只保存一个对象.

save(obj1);
save(obj2);
Run Code Online (Sandbox Code Playgroud)

obj2例如,只会保存.

我可以创建obj一个具有自己的save方法的类的实例,该方法负责将存储转义为该对象.或者在某处保留部分/咖喱功能列表,但我希望那里有一站式解决方案.就像是:

var save = _.easySolution(function(obj) {
  ... 
}, delay);
Run Code Online (Sandbox Code Playgroud)

我正在寻找以下保存每个对象的保存字符串,但只保存每个对象一次.

save(obj1);
save(obj2);
save(obj3);
save(obj2);
save(obj2);
save(obj3);
save(obj2);
save(obj1);
Run Code Online (Sandbox Code Playgroud)

编辑:这样的事情,或许,只是不那么令人费解,而一些不变异的obj一个__save功能?

function save(obj) {
  if(!obj.__save) {
    obj.__save = _.debounce(_.partial(function(obj) {
      ...
    }, obj), delay);
  }

  obj.__save();
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*uch 16

你将要为每个传递的参数创建一个去抖动函数版本.你可以使用debounce(),memoize()wrap()相当容易地做到这一点:

function save(obj) {
    console.log('saving', obj.name);
}

var saveDebounced = _.wrap(_.memoize(function() {
    return _.debounce(save);
}, _.property('id')), function(func, obj) {
    return func(obj)(obj);
});

saveDebounced({ id: 1, name: 'Jim' });
saveDebounced({ id: 2, name: 'Jane' });
saveDebounced({ id: 1, name: 'James' });
// ? saving James
// ? saving Jane
Run Code Online (Sandbox Code Playgroud)

您可以看到'Jim'未保存,因为具有相同ID的对象立即保存.该saveDebounced()功能细分如下.

调用_memoize()是基于一些解析器函数缓存去抖动函数.在这个例子中,我们只是将它基于id属性.所以现在我们有办法获得save()任何给定参数的去抖动版本.这是最重要的部分,因为它debounce()具有各种内部状态,因此我们需要为可能传递给的任何参数提供此函数的唯一实例save().

我们wrap()用来调用缓存的函数(或创建它然后缓存它,如果它是第一次调用),并传递函数我们的对象.生成的saveDebounced()函数具有与之完全相同的签名save().不同之处在于saveDebounced()会根据参数去抖动.


Eam*_*ain 0

也许是这样的:

var previouslySeen = {}

var save = _.debounce(function(obj) {
  var key = JSON.stringify(obj);
  if (!previouslySeen[key]) {
     previouslySeen[key] = 1;
  } else {
     ...
  }
}, delay);
Run Code Online (Sandbox Code Playgroud)