【发布时间】:2015-12-19 17:42:33
【问题描述】:
我试图了解一些关于 RxJs 的事情。我想做的是使用一些 JSON 数据,并在数据进入时立即开始在 DOM 上呈现该数据。我已经设置了流请求、响应和显示。它的每一个输出都很好,但它是一次性完成的,而不是随着时间的推移。
我想在数据进入时开始在页面上显示数据,而不是等待整个文件完成然后立即显示,这会产生很长的等待时间。
//Cache the selector
var $resultList = $('.results');
//Gets the JSON (this will not be a static file,just for testing)
var requestStream = Rx.Observable.just("/results.json");
var responseStream = requestStream
.flatMap(function(requestUrl) {
return Rx.Observable.fromPromise(jQuery.getJSON(requestUrl))
});
var displayStream = responseStream.subscribe(
function(response) {
//This maps to a Handlebars Template and puts it on the DOM
$resultList.html(compiledTemplate(response));
},
function(err) {
console.log('Error: %s', err);
},
function() {
console.log('Completed');
});
//Sample of the data from the JSON file
Object{
beginIndex: "1"
catId: "111"
endIndex: "1"
products: Array[100]
}
【问题讨论】:
-
您已经正确设置了所有内容,但是,getJSON 会立即检索所有内容。从这个意义上说, responseStream 不是一个流,它是一个完全形成的对象。从 jQuery.getJSON 解析的承诺只是页面的整个响应。仅当您同时从多个来源(results.json、results2.json 等)加载数据时,您的代码才会产生您正在寻找的操作。
-
有没有办法开始将单个 JSON 文件转换为一个对象,并在该对象进入时开始循环遍历该对象上的数组?我正在寻找一种在数据传入和处理时以增量方式流式传输数据的方法。
-
你真的依赖于浏览器的行为。响应以具有统一大小的块的形式出现,但可以在数据对象中的任何位置开始和结束: [chunk 1, data: "[{object 1},{[ob] [chunk 2, data: "[{ject2} {[object3...etc.... broswer 收集这些并将它们按正确的顺序排列。现在您要问的是如何破解 http 协议,这太过分了。如果你想逐个对象解析这个对象,你需要使用 websocket 连接到你的服务器并一个一个地发出每个成员,这比单个 get 调用更流畅。
-
敲最后一个答案,它可能会将所有内容分成一大块发送,就我们的目的而言,它会在瞬间到达。您仍在寻找类似 websocket 的行为。 (例如:socket.io)
-
那么如果流式传输不是一个好的路由,那么分块呢?因此,取出该数组中的前 10 个并将其发送出去以进行显示。然后接下来的10个等等。所以更像是在更小的块中缓冲/处理。
标签: javascript json rxjs reactivex