我有一个JSON文件,它一直被追加到它完成为止(它包含来自模拟的坐标;当这个模拟正在运行时,每个时间帧的坐标被附加到JSON文件中)。
在我的网页中,这些坐标必须在模拟一开始就显示出来。为此,我使用Oboe.js在JSON文件中显示坐标:
function smashIt(path){
oboe(path)
.node('frames.*', function( frame ){
animationFrames.push(frame);
})
.fail( function( errorReport ){
console.log(errorReport);
smashIt(path);
})
.done(function(finalObj){
finalObject = finalObj;
console.log(finalObj);
});
}这样做的问题是,由于它基本上是一个JSON流,直到文件完全完成,所以当Oboe函数到达已经可用的内容的末尾时,JSON可能无效:它可能缺少一个}或逗号来使JSON有效。
如果发生这种情况,我在.fail-event中捕捉到的双簧管会抛出一个错误。在记录错误后,我再次运行整个Oboe函数,最后在大约50 .fail()之后,流将完成,我最终将拥有整个JSON对象。
但这是个糟糕的方法。当前的功能可以在smashIt()-function每次重新启动时显示坐标,但在此之前,.node()-event将从JSON文件中提供所有JSON节点(自上一次smashIt()执行以来,总会多出50-100个)。
我正在寻找的是一种处理无效JSON错误并让Oboe .node()-method等待的方法(还是更好的方法?)直到JSON 是有效的,而不是必须使用.fail-approach;因此只使用一个smashIt()执行,其中无效的JSON错误被正确地处理。
我希望Oboe.js自己来处理这件事,但看起来并非如此。
发布于 2015-10-08 15:08:10
要获得流,我能想到的最简单的方法是使用XMLHTTPRequest轮询JSON文件。
您将不得不处理不完整的JSON。您可以很容易地检测条目边界,并进行一些自定义解析以获得部分数据。
一个改进是只获取文件的新部分。您可以考虑使用header,或者有一个服务器端脚本,该脚本将从偏移开始返回内容。
进一步的改进将是放弃XMLHTTPRequest投票模型,使用WebSockets或ServerSentEvents来实现push模型。您可以使用一个简单的守护进程定期读取JSON文件,或者您甚至可以编写一个直接连接到模拟器软件工程强化的守护进程。
https://stackoverflow.com/questions/33018832
复制相似问题