在淘汰赛中,您可以执行以下操作:
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);
#