Javascript 更新datatable.net表中的修改记录或新记录时,For循环提前退出

Javascript 更新datatable.net表中的修改记录或新记录时,For循环提前退出,javascript,jquery,for-loop,jquery-datatables,Javascript,Jquery,For Loop,Jquery Datatables,我正在使用Datatables jQuery插件。该表从AJAX源(一个SQL Server查询,由ASP.NET处理为JSON对象)提取数据。我想创建表的实时视图,以便实时显示更改。但是,我不是每隔几秒钟用fnReloadAjax()(根据经验,这在浏览器上已经证明是相当麻烦的)重新加载整个表,而是使用fnAddData()和fnUpdate()更新新的或修改的记录 在获得一个只包含新记录或修改记录的JSON对象后,下面是我处理该对象的代码 var newData = upda

我正在使用Datatables jQuery插件。该表从AJAX源(一个SQL Server查询,由ASP.NET处理为JSON对象)提取数据。我想创建表的实时视图,以便实时显示更改。但是,我不是每隔几秒钟用
fnReloadAjax()
(根据经验,这在浏览器上已经证明是相当麻烦的)重新加载整个表,而是使用
fnAddData()
fnUpdate()
更新新的或修改的记录

在获得一个只包含新记录或修改记录的JSON对象后,下面是我处理该对象的代码

        var newData = updatedDataJSON.aaData;

        if (newData[0] != null) {                
            for (i = 0; i < newData.length; i++) {     //Loop through each object
                if (newData[i].bNewCase === true) {    //Process new cases
                    oTable.fnAddData(newData[i]);   
                } else {                              //Process modified cases   
                    var tableArray = oTable.fnGetData();
                    var index;
                    var found = false;
                    var serial = newData[i].serial;  
                    var dataObject = newData[i];

                    //First gotta find the index in the main table for 
                    // the record that has been modified.  This is done 
                    // by matching the serial number of the newData 
                    // object to the original aData set:

                    for (ii = 0; ii < tableArray.length; ii++) {
                        var value = tableArray[ii]['serial'];
                        value = value.replace(/<\/?[^>]+(>|$)/g, ""); 
                        if (value === serial) {
                            index = ii;
                            found = true;                                
                        }
                    }
                    if (found) {
                        oTable.fnUpdate(dataObject, index);
                        console.log('Updated ' + newData[i].serial);
                    }                                         
                }
            }
        }
var newData=updatedDataJSON.aaData;
如果(newData[0]!=null){
对于(i=0;i|$)/g,“”;
如果(值===串行){
指数=ii;
发现=真;
}
}
如果(找到){
FNDUpdate(数据对象、索引);
console.log('Updated'+newData[i].serial);
}                                         
}
}
}
我的问题是,即使第一个for循环的
newData.length
属性可能大于1,for循环也会提前退出(经过一次迭代)。我在末尾添加了
console.log
语句,它开始传递错误,指出
newData[I].serial
未定义。这让我觉得整个newData数组都被破坏了或是什么


我真的希望我刚刚犯了一个愚蠢的错误(虽然我检查了又检查了又检查了一些,但找不到一个)。也许我忽略了什么。如果有人有任何建议,我们将不胜感激。

以上评论中公布的解决方案归功于@elclarnrs。解决方案是在函数范围内声明
i
ii
的值。这使一切顺利进行。很高兴知道,以备将来参考。

该解决方案归功于@elclarnrs,在上面的评论中发布。解决方案是在函数范围内声明
i
ii
的值。这使一切顺利进行。很高兴知道,以备将来参考。

如何将
value=tableArray[ii]['serial']
更改为
value=tableArray[ii]。serial
?也许是范围问题?除非
i
ii
在其他地方声明,否则它们应该在该函数的范围内声明,因此
for(var ii=0).
var newData=updatedDataJSON.aaData在哪里来自哪里?听起来您正在访问ajax回调之外的数据,而ajax是asynchronous@elclanrs您的解决方案完全有效(这是声明
i
ii
的范围问题)@charlietfl数据是从
$.ajax
请求中提取的,是的,它是异步的。我正在使用
.responseText
属性访问回调外部的数据。这是一种不好的做法吗(还有其他选择吗)?谢谢你们两位的帮助!将
value=tableArray[ii]['serial']
更改为
value=tableArray[ii].serial怎么样?也许是范围问题?除非
i
ii
在其他地方声明,否则它们应该在该函数的范围内声明,因此
for(var ii=0).
var newData=updatedDataJSON.aaData在哪里来自哪里?听起来您正在访问ajax回调之外的数据,而ajax是asynchronous@elclanrs您的解决方案完全有效(这是声明
i
ii
的范围问题)@charlietfl数据是从
$.ajax
请求中提取的,是的,它是异步的。我正在使用
.responseText
属性访问回调外部的数据。这是一种不好的做法吗(还有其他选择吗)?谢谢你们两位的帮助!