Как я могу генерировать медленный ответ, используя коа?
При запуске коа я получаю следующее предупреждение:
устарела Поддержка генераторов будет удалена в 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 ОК
Тип контента: текстовый / простой; кодировка = UTF-8
Дата: среда, 27 февраля 2019 21:17:06 GMT
Подключение: keep-alive
Передача-кодировка: чанки
блаб
блаб
блаб
блаб
...
Примечание. Сообщения печатаются по одному.
Как я могу достичь вышеуказанного, используя способ v3?
1 ответ
Чтобы было ясно, v3 не вышел, это всего лишь предупреждение о том, что Коа отходит от функций генератора. Вы не используете 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'));
Замените функцию генератора на обычную функцию или функцию стрелки, которая имеет аргумент
ctx
замещать
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();
}
}