Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React中基于调度循环的取消跳出呼叫_Javascript_Reactjs_Reactjs Flux_Flux - Fatal编程技术网

Javascript React中基于调度循环的取消跳出呼叫

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(

最近React.JS Conf有基于调度循环优化的Flux panel和Kyle Davis de bounce调用。有谁能提供一些关于如何实现这一点的例子吗

我的理解是它看起来像这样:

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是否与您的实现不同?