将多个挖空订阅整理到单个通知中



在淘汰赛中,您可以执行以下操作:

myObservable.subscribe(function(newValue){ doSomething(); });

现在,如果我有多个想要订阅的可观察量,我可以这样做:

myObservable1.subscribe(function(){ doSomething(); }); myObservable2.subscribe(function(){ doSomething(); });

但是,当我有很多订阅时,这可能会变得有点难看,而且如果您想限制当前更新机制,则必须按订阅执行此操作。

那么有没有办法让我以某种方式将它们全部包装起来呢?

ko.subscribeToMany(myObservable1, myObservable2) .throttle(500) .subscribe(function(){ doSomething() });

有一个场景,我基本上想根据更改刷新图表,并且它非常耗费资源,所以我希望不必订阅每个动态数据位,我可以将它们整理成单个计算样式订阅,然后从那里限制该单个订阅,因为其他订阅可能希望立即收到通知而没有延迟/限制。

那么淘汰赛可以做到以上吗?

快速实现可能如下所示:

ko.obsgroup = function() {
    var groupManager = {};    
    var observables = [];
    var throttle = 0;
    var throttleTimeout;
    for(var i = 0; i < arguments.length; i++) {
        observables.push(arguments[i]);
    }
    groupManager.throttle = function(duration) {
        throttle = duration;
        return groupManager;
    };
    groupManager.subscribe = function(handler) {
        function throttledHandler(val) {
            if(throttle > 0) {
                if(!throttleTimeout) {
                    throttleTimeout = setTimeout(function() {
                        throttleTimeout = undefined;
                        handler(val);
                    }, throttle);
                }
            } else {
                handler(val);
            }
        }
        for(var i = 0; i < arguments.length; i++) {
            observables[i].subscribe(throttledHandler);
        }
        return groupManager;
    };
    return groupManager;
};

用法:

var vm = {
    v1: ko.observable(0),
    v2: ko.observable(0),
    v3: ko.observable(0),
    log: ko.observable(0)
};
ko.obsgroup(vm.v1, vm.v2, vm.v3)
  .throttle(1000)
  .subscribe(function(val) {
      vm.log('changed: ' + Date.now());
  });
ko.applyBindings(vm);

#

演示:JSFiddle

最新更新