繁体   English   中英

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

[英]KnockoutJS: Infinite recursion while modifying observable array within the subscription callback

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

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"); 

根据您的订阅逻辑,如果已经存在“ first”值,则不想添加。 但是,该“第一个”值将始终存在于可观察数组中。 添加控制台日志,就像我在上面的代码中添加的一样。

现在这就是您将看到的输出

在此处输入图片说明

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

我认为,如果数组中存在“第一个”元素,则需要更改添加的逻辑,然后不要像中断操作或类似操作那样插入它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM