Динамический фрагментарный ответ в NodeJS - PullRequest
0 голосов
/ 24 мая 2018

Учитывая следующий псевдокод JavaScript (пример 1),
, как вы можете видеть, есть 3 async streams, которые в свою очередь пишут в ответ.Они, конечно, будут писать в ответ асинхронным способом, поэтому порядок чанков не сохраняется (это на самом деле непредсказуемо).

import pre from './pre';
import content from './content';
import post from './post';

export function renderIndex(req, res) {
  res.writeHead(200, {
    'Content-Type': 'text/html; charset=utf-8',
    'Transfer-Encoding': 'chunked',
  });

  const onEnd = () => {
    if(!pre._readableState.ended) return;
    if(!body._readableState.ended) return;
    if(!post._readableState.ended) return;

    res.end();
  };

  pre.on('data', (chunk) => { res.write(chunk); }).on('end', onEnd);
  body.on('data', (chunk) => { res.write(chunk); }).on('end', onEnd);
  post.on('data', (chunk) => { res.write(chunk); }).on('end', onEnd);
}

возможно ли сообщить клиенту позицию каждого чанкаданных?

Я хотел бы добиться чего-то вроде этого:

// ---- Stream 1 keep open
<html>
  <head>
  ...
  ...
  ...
  ...


// --- Stream 2 keep open

<body>
  ...
  ...
  ...

// --- Stream 3 keep open
<script src="..."></script>
<script src="..."></script>
<script src="..."></script>


// --- Stream 1 CLOSE
  </head>

// --- Stream 2 CLOSE
  </body>

// --- Stream 3 CLOSE
  </html>


// res.end()
  1. Range Requests
  2. Multipart Range

Мрамороподобное Объяснение:

  • актуально : [pre] [post] [body] [pre] [body] [/pre] [/post] [/body]
  • желательно [pre] [/pre] [body] [/body] [post] [/post]

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Я полагаю, что вы можете достичь ожидаемого поведения с помощью библиотеки highland.js .Это дает вам возможность выполнять некоторые операции над потоками

/*
the sample to show how it works
H([
  H([1, 2, 3]),
  H([4, 5, 6])
]).sequence().pipe(process.stdout);
*/

import pre from './pre';
import content from './content';
import post from './post';
const H = require('highland')

export function renderIndex(req, res) {
  res.writeHead(200, {
    'Content-Type': 'text/html; charset=utf-8',
    'Transfer-Encoding': 'chunked',
  });

  H([
    pre,
    content,
    post
  ]).sequence().pipe(res);
}
0 голосов
/ 24 мая 2018

Самый простой способ решить эту проблему - записать куски в выделенные переменные, а в случае события end записать весь ответ до / тело / запись в res.

...