Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.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 如何在一起调用多个订阅的变量时只调用一次函数_Javascript_Knockout.js_Observer Pattern_Observable - Fatal编程技术网

Javascript 如何在一起调用多个订阅的变量时只调用一次函数

Javascript 如何在一起调用多个订阅的变量时只调用一次函数,javascript,knockout.js,observer-pattern,observable,Javascript,Knockout.js,Observer Pattern,Observable,这不是一个具体的技术问题,但我很好奇,解决这样一个问题的最佳方法是什么?尽管我在淘汰赛中遇到了这个问题,但我确信这个用例在其他地方也是有效的 假设我订阅了两个变量,simpleObserve1,simpleObserve2,这样每当它们的值更改时,它们都会调用一个函数resetAllValues() 这里有两个问题 调用resetAllValues()时,它会将所有订阅的值更改为0,包括simpleObserve1和simpleObserve2。这依次调用resetAllValues()。如何防

这不是一个具体的技术问题,但我很好奇,解决这样一个问题的最佳方法是什么?尽管我在淘汰赛中遇到了这个问题,但我确信这个用例在其他地方也是有效的

假设我订阅了两个变量,
simpleObserve1
simpleObserve2
,这样每当它们的值更改时,它们都会调用一个函数
resetAllValues()

这里有两个问题

  • 调用resetAllValues()时,它会将所有订阅的值更改为0,包括
    simpleObserve1
    simpleObserve2
    。这依次调用
    resetAllValues()
    。如何防止它进入无限循环
  • 如果我想同时更新这两个变量,但只调用一次
    resetAllValues()
    ,该怎么办

  • 我曾尝试使用该方法来帮助我,但我想知道是否有更好的方法来做到这一点。

    我创建了一个高阶函数
    acceptXParams
    ,该函数将检查参数的数量是否等于
    fn.length
    或任意数。如果不是,则不会调用原始函数:

    函数acceptXParams(fn,numoparams){
    var numoparams=numoparams==未定义?fn.length:numoparams;
    返回函数(){
    if(arguments.length!==numoparams){
    返回;
    }
    返回fn.apply(fn,参数);
    }
    }
    /**范例**/
    函数和(a,b,c){
    返回a+b+c;
    }
    var sum3=接受参数(总和);
    console.log(sum3(1,2,3));
    console.log(sum3(1,2));
    日志(sum3(1,2,3,4))可能会帮助您。通过在计算结果中使用可观察值,knockout创建了一个订阅。通过扩展此计算,快速后续的变化被合并到某种微任务中

    它们阻止了循环行为,但仍不清楚触发了多少更新。即:当设置为
    5
    10
    时,会导致1或2次计算更新。所以我不确定这是否能回答你的问题

    var i=0,
    simpleObserve1=ko.observable(0),//初始值
    simpleObserve2=ko.可观测(0);//初始值
    ko.computed(函数resetAllValues(){
    log(“设置”++i+”,在“:”之前);
    log(“1:,simpleObserve1());
    log(“2:,simpleObserve2());
    simpleObserve1(0);
    simpleObserve2(0);
    log(“设置”+i+”,在“:”之后);
    log(“1:,simpleObserve1());
    log(“2:,simpleObserve2());
    }).延伸({
    延期:对
    });
    simpleObserve1(5);//值在代码中的任意位置更改
    simpleObserve2(10);//代码中任意位置的值已更改
    .as控制台包装{最小高度:100%;}
    
    var simpleObserve1 = ko.observable(0), // initial values
        simpleObserve2 = ko.observable(0); // initial values
    
    var resetAllValues = function resetAllValues() {
        /* this function takes all observable values and resets them */
        {...}
    }
    
    simpleObserve1.subscribe(function(){
        resetAllValues();
    });
    
    simpleObserve2.subscribe(function(){
        resetAllValues();
    });
    
    simpleObserve1(5); // value changed anywhere in code
    simpleObserve2(10); // value changed anywhere in code