Как я могу генерировать медленный ответ, используя коа? - PullRequest
0 голосов
/ 28 февраля 2019

При запуске koa я получаю следующее предупреждение:

устарело Поддержка генераторов будет удалена в v3

Что мой код делает, чтобы создать медленный ответ.Например, запись в ответ каждую секунду, в течение 30 секунд.

(new Koa()).use(function *(){
  const tr = through();
  setInterval(() => tr.write('blabla\n'), 1000);
  setTimeout(tr.end, 30000);
  this.type = 'text';
  this.body = tr;
}).listen(3003, () => console.log('Listen 3003: slow response'));
curl http://localhost:3003

HTTP / 1.1 200 OK
Тип содержимого: текст / обычный текст;charset = utf-8
Дата: среда, 27 февраля 2019 21:17:06 GMT
Соединение: keep-alive
Передача-кодировка: chunked

blabla
blabla
blabla
blabla
...

Примечание: сообщения печатаются одно за другим.

Как мне добиться вышеуказанного, используя способ v3?

1 Ответ

0 голосов
/ 28 февраля 2019

Для ясности, v3 не вышел, это всего лишь предупреждение о том, что Koa отходит от функций генератора.Вы не используете yield, поэтому его довольно легко преобразовать:

const Koa = require('koa');
const through = require('through');

(new Koa()).use((ctx) => {
  const tr = through();
  setInterval(() => tr.write('blabla\n'), 1000);
  setTimeout(tr.end, 30000);
  ctx.type = 'text';
  ctx.body = tr;
}).listen(3003, () => console.log('Listen 3003: slow response'));
  1. Замените функцию генератора обычной функцией или функцией стрелки, у которой есть аргумент ctx

  2. Заменить this на ctx

Редактировать: Кроме того, я считаю, что в этом коде есть ошибка.Вы создаете новый интервал с каждым запросом, но никогда не очищаете их.Я думаю, что это будет считаться утечкой памяти.

Вы, вероятно, должны сделать что-то вроде этого:

const Koa = require('koa');
const through = require('through');

(new Koa()).use((ctx) => {
  const tr = through();
  let intervalId = setInterval(() => tr.write('blabla\n'), 1000);
  setTimeout(end(intervalId, tr), 30000);
  ctx.type = 'text';
  ctx.body = tr;
}).listen(3003, () => console.log('Listen 3003: slow response'));

function end(intervalId, tr) {
  return () => {
    clearInterval(intervalId);
    tr.end();
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...