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()
会根据参数去抖动.
也许是这样的:
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)
归档时间: |
|
查看次数: |
2683 次 |
最近记录: |