Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.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 KnockoutJS:在订阅回调中修改可观察数组时的无限递归_Javascript_Knockout.js - Fatal编程技术网

Javascript KnockoutJS:在订阅回调中修改可观察数组时的无限递归

Javascript KnockoutJS:在订阅回调中修改可观察数组时的无限递归,javascript,knockout.js,Javascript,Knockout.js,我不明白为什么下面的代码段会导致无限递归: var observableArray = ko.observableArray(); observableArray.subscribe(function (changes) { changes.forEach(function(change) { console.log("change: " + JSON.stringify(change)); if (change.status === 'added') {

我不明白为什么下面的代码段会导致无限递归:

var observableArray = ko.observableArray();
observableArray.subscribe(function (changes) {
    changes.forEach(function(change) {
        console.log("change: " + JSON.stringify(change));
        if (change.status === 'added') {
            if (change.value === "first") {
                observableArray.push("second");
            }
        }
    });
}, null, "arrayChange");

observableArray.push("first");
下面是控制台日志:

change: {"status":"added","value":"first","index":0}    
change: {"status":"added","value":"first","index":0}  
change: {"status":"added","value":"first","index":0}  
change: {"status":"added","value":"first","index":0}  
change: {"status":"added","value":"first","index":0}  
...  
Uncaught RangeError: Maximum call stack size exceeded  

我真的不明白这里发生了什么。有人能帮我吗

这看起来像是逻辑错误

var observableArray = ko.observableArray();
 console.log(changes);  //Add log here
observableArray.subscribe(function (changes) {
    changes.forEach(function(change) {
        console.log("change: " + JSON.stringify(change));
        if (change.status === 'added') {
            if (change.value === "first") {
                observableArray.push("second");
            }
        }
    });
}, null, "arrayChange");

observableArray.push("first"); 
根据订阅逻辑,如果“第一”值已经存在,则不希望添加该值。但是“第一”值总是会出现在你的可观察数组中。添加控制台日志,正如我在上面代码中添加的一样

这就是您将看到的输出

您已经添加了array.push(“秒”);但是,在同一个可观察数组中,“first”始终存在,代码将不断添加“second”,您的代码将导致超出调用堆栈大小

我认为您需要更改逻辑以添加,如果数组中有“first”元素,则不要像break操作或类似操作那样插入它