基于 React 中的调度循环去抖动调用
De-bounce calls based on dispatch loop in React
最近 React.JS Conf 有 Flux 面板和 Kyle Davis mentioned 基于调度循环优化的去抖动调用。任何人都可以提供一些关于如何实现它的例子吗?
我的理解是它看起来像这样:
function debounce(duration) {
var _timer = null;
var toCall = [];
function dispatch() {
_timer = null;
toCall.forEach(function(opts) {
if (opts.shouldCall) {
opts.fn.apply(undefined, opts.args);
}
opts.shouldCall = false;
});
}
return function debounce(fn) {
var myAction = {fn: fn, args: [], shouldCall: false};
toCall.push(myAction);
return function() {
myAction.shouldCall = true;
myAction.args = Array.prototype.slice.call(arguments);
clearTimeout(_timer);
_timer = setTimeout(dispatch, duration);
};
};
}
这看起来很复杂,但实际上只是尾随共享去抖动。多个函数在同一个计时器上进行去抖动,并且在同一个滴答中调用所有函数。保留最新的参数(在这种特定情况下不需要,但不会引起问题)。
我们为所有(不是每个)商店创建了其中一个。持续时间大部分是任意的,但足够长以允许浏览器在我们执行商店更新逻辑和 UI 更新之间呈现一个框架,这可能会使滚动感觉更灵敏。
var storeDebounce = debouncer(20);
在我们的商店,而不是这个:
emitChange: function() {
this.emit(CHANGE_EVENT);
},
我们这样做:
emitChange: storeDebounce(function() {
this.emit(CHANGE_EVENT);
}.bind(this)),
现在,如果一个或多个商店在同一时间更新或短时间连续更新多次(通常发生在 promise 或其他有保证的异步代码中),我们只会为每个受影响的商店发出一个更改事件。
免责声明:未测试
最近 React.JS Conf 有 Flux 面板和 Kyle Davis mentioned 基于调度循环优化的去抖动调用。任何人都可以提供一些关于如何实现它的例子吗?
我的理解是它看起来像这样:
function debounce(duration) {
var _timer = null;
var toCall = [];
function dispatch() {
_timer = null;
toCall.forEach(function(opts) {
if (opts.shouldCall) {
opts.fn.apply(undefined, opts.args);
}
opts.shouldCall = false;
});
}
return function debounce(fn) {
var myAction = {fn: fn, args: [], shouldCall: false};
toCall.push(myAction);
return function() {
myAction.shouldCall = true;
myAction.args = Array.prototype.slice.call(arguments);
clearTimeout(_timer);
_timer = setTimeout(dispatch, duration);
};
};
}
这看起来很复杂,但实际上只是尾随共享去抖动。多个函数在同一个计时器上进行去抖动,并且在同一个滴答中调用所有函数。保留最新的参数(在这种特定情况下不需要,但不会引起问题)。
我们为所有(不是每个)商店创建了其中一个。持续时间大部分是任意的,但足够长以允许浏览器在我们执行商店更新逻辑和 UI 更新之间呈现一个框架,这可能会使滚动感觉更灵敏。
var storeDebounce = debouncer(20);
在我们的商店,而不是这个:
emitChange: function() {
this.emit(CHANGE_EVENT);
},
我们这样做:
emitChange: storeDebounce(function() {
this.emit(CHANGE_EVENT);
}.bind(this)),
现在,如果一个或多个商店在同一时间更新或短时间连续更新多次(通常发生在 promise 或其他有保证的异步代码中),我们只会为每个受影响的商店发出一个更改事件。
免责声明:未测试