javascript - 将多个 knockout 订阅整理到单个通知中?

标签 javascript knockout.js observable

在 knockout 中,您可以执行以下操作:

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

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

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

但是,当我有大量订阅时,这可能会有点难看,而且如果您当前想限制更新机制,则必须针对每个订阅执行此操作。

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

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

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

那么上述情况可以通过 knockout 实现吗?

最佳答案

快速实现如下:

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

关于javascript - 将多个 knockout 订阅整理到单个通知中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27273587/

相关文章:

angular - Rxjs 可观察 : Get HTTP data only for the first subscriber and cached data for the rest

javascript - 自动滚动到 Magento 中的下一个选项

javascript - 如何在 i18next 中使用 Knockout observables?

rxjs - RxJS 5 Observable 源能否被链下的另一个停止?

ios - RxSwift 订阅 <Bool> 变化取决于一个变量 (MVVM)

knockout.js - 将ckeditor数据绑定(bind)为可观察到的 knockout 时如何更新它?

javascript - 查询框架内的选择器

javascript - Sequelize 无法通过关联创建

javascript - 使用 Shopify Liquid 元字段的变体相关产品

javascript - Knockoutjs View 定位器?