在javascript中异步使用chunked数据

时间:2018-03-10 08:22:40

标签: javascript http asynchronous http-streaming

我有一个(GET)端点,以块(Transfer-Encoding: chunked)发送数据。数据经过JSON编码并逐行发送。

有没有办法在JavaScript(或使用一些JavaScript库)中以异步方式使用此端点发送的数据?

要清楚,我知道如何执行异步GET,但我希望GET请求不等待传输整个数据,而是通过以下方式读取数据行线路到达时。例如,在做的时候:

curl  http://localhost:8081/numbers

以下几行在可用时逐一显示(我所做的示例服务器在发送一行和第二行之间等待一秒钟。)

{"age":1,"name":"John"}
{"age":2,"name":"John"}
{"age":3,"name":"John"}
{"age":4,"name":"John"}

我想重现相同的行为curl展品,但在浏览器中。我不想让用户等到所有数据都可用才能显示任何内容。

1 个答案:

答案 0 :(得分:5)

感谢DanRedu我能够使用Fetch API汇总一个以增量方式使用数据的示例。需要注意的是,这不适用于Internet Explorer,并且必须由用户在Firefox中启用:

   /** This works on Edge, Chrome, and Firefox (from version 57). To use this example
    navigate to about:config and change

    - dom.streams.enabled preference to true
    - javascript.options.streams to true


    See https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream
*/

fetch('http://localhost:8081/numbers').then(function(response) {

  console.log(response);

  const reader = response.body.getReader();

  function go() {
    reader.read().then(function(result) {
      if (!result.done) {
        var num = JSON.parse(
          new TextDecoder("utf-8").decode(result.value)
        );
        console.log(
          "Got number " + num.intVal
        );        
        go ();
      }
    })
  }

  go ();
})

完整示例(使用服务器)可用at my sandbox。我发现它说明XMLHttpRequest将此版本与this one进行比较的限制,enter image description here不使用fetch API。