使用setTimeout()检查JSON文件中的更改

时间:2016-01-12 15:31:08

标签: javascript json

我正在编写一个在浏览器中运行的应用程序。我每分钟从服务器加载一个包含当前数据的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;
&#13;
&#13;

3 个答案:

答案 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失败了。 :(

在分配之前,您似乎同时使用chch1。如果ch1很容易看到:

if (ch1 !== ch[0])

在oldValues中第一次分配值之前,将执行将近3秒。

您还可以在2个地方使用ch[0],而无需检查是否设置了chch[0]

你可以试试这个:

setTimeout(oldValues, 3000);
oldValues();
function oldValues() {...

所以ch1会在同步AJAX结束后立即生成一个值,并在尝试第一次使用它之前在if

我也会摆脱ch = functionch = 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