我正在编写一个在浏览器中运行的应用程序。我每分钟从服务器加载一个包含当前数据的json文件,并且需要将这些数据与先前加载的json文件中的数据进行比较。如果有任何更改,我将在应用程序内动态显示新数据。
我使用了延迟功能。 JSfiddle的例子。 但是,我无法从函数中获取局部变量,延迟到下一个函数,我可以在其中比较数据。
我尝试过创建全局变量,尝试使用范围变量,甚至在存储中保存值。没有什么对我有用。 JSON文件的输出是对象。
请帮忙吗? JSfiddle:https://jsfiddle.net/vladoss/r02aLv60/2/
dataUpdates();
var ch1;
function dataUpdates() {
ch = (function() {
ch = null;
$.ajax({
'async': false,
'global': false,
'url': "json.json", //non-exisitng json.
'dataType': "json",
'success': function (data) {
ch = data;
}
});
return ch; //current data
})();
setTimeout(oldValues, 3000);
function oldValues() {
ch1 = ch[0]; //old data
}
if (ch1 !== ch[0]) { //Here I need be able to read variable ch1.
console.log(ch1); //ch1 is undefined
//...
}
}
setInterval(dataUpdates, 5000);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
&#13;
答案 0 :(得分:1)
您可以比较两个json文件的校验和。为此,您可以使用library。代码结构可以简化为此。
var curCh = null;
function dataUpdates() {
$.ajax({
'async': false,
'global': false,
'url': "json.json", //non-exisitng json.
'dataType': "json",
'success': function (data) {
var ch = checksum(data);
// Comparing checksums
if(curCh != ch) {
curCh = ch;
console.log('new json! do updates here!');
}
}
});
}
setInterval(dataUpdates, 5000);
答案 1 :(得分:0)
JSFiddle失败了。 :(
在分配之前,您似乎同时使用ch
和ch1
。如果ch1
很容易看到:
if (ch1 !== ch[0])
在oldValues中第一次分配值之前,将执行将近3秒。
您还可以在2个地方使用ch[0]
,而无需检查是否设置了ch
或ch[0]
!
你可以试试这个:
setTimeout(oldValues, 3000);
oldValues();
function oldValues() {...
所以ch1
会在同步AJAX结束后立即生成一个值,并在尝试第一次使用它之前在if
我也会摆脱ch = function
和ch = null
。你为什么拥有它们?
除非ch1 !== Ch[0]
在每次AJAX响应后都是真的,即使JSON没有改变!参见:
a = {} ; b = {} ; console.log(a == b)
这是因为您使用不同的引用获得了不同的对象,即使它们的值相同==
也不能比较它们。也许这可以提供帮助:Object comparison in JavaScript
更好的解决方案是将Etag与http://api.jquery.com/jquery.ajax/一起使用。搜索&#34; ifModified&#34;和&#34; etag&#34;在链接中。
答案 2 :(得分:0)
dataUpdates();
function dataUpdates() {
ch = (function() {
ch = null;
$.ajax({
'async': false,
'global': false,
'url': "json.json",
'dataType': "json",
'success': function (data) {
ch = data;
}
});
return ch;
})();
setTimeout(oldValues, 20000); //run oldValues function after 20s
};
function oldValues() { //save previous ch into variable
ch1 = ch;
setTimeout(checkData, 20000); //wait 20s and compare previous ch(=ch1) with current ch
};
function checkData(){
console.log(ch[0].Title);
console.log(ch1[0].Title);
}
setInterval(dataUpdates, 30000); //run dataUpdates function every 30s