Javascript React中基于调度循环的取消跳出呼叫
最近React.JS Conf有基于调度循环优化的Flux panel和Kyle Davis de bounce调用。有谁能提供一些关于如何实现这一点的例子吗 我的理解是它看起来像这样:Javascript React中基于调度循环的取消跳出呼叫,javascript,reactjs,reactjs-flux,flux,Javascript,Reactjs,Reactjs Flux,Flux,最近React.JS Conf有基于调度循环优化的Flux panel和Kyle Davis de bounce调用。有谁能提供一些关于如何实现这一点的例子吗 我的理解是它看起来像这样: function debounce(duration) { var _timer = null; var toCall = []; function dispatch() { _timer = null; toCall.forEach(function(
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)),
现在,如果一个或多个存储在同一时间内被更新多次,或者连续更新很短(通常与承诺或其他保证的异步代码一起发生),我们将只为每个受影响的存储发出一个更改事件
免责声明:未测试请您稍微说明一下我们为所有(不是每个)门店创建了一个?@消息,否则每个门店的更改事件都会有一个不同的setTimeout,并且它们都会在彼此之后发送,可能导致某些组件的数据过时,甚至出现不可能出现的错误。优化中最重要的一点是,按照最佳实践,你不会破坏任何东西(第二点不是破坏任何东西,但有时这是允许的)。因此,你只需要为所有商店设置一个
emitChange:storeDebounce
?!应在何处定义以影响所有门店?你能添加一些使用2个存储和共享emitchange的示例吗(如果它按照我的想法工作的话)?@message,它只是一个函数,所以你可以知道如何将它提供给存储(将它放在一个模块中,初始化它们时从main.js传递它,使用DI框架,等等)loadash
或下划线
debouncer是否与您的实现不同?