1

运行 koa 时,我收到以下警告:

对生成器的支持将在 v3 中删除

我的代码所做的是创建一个缓慢的响应。例如,每 1 秒写入一次响应,持续 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
日期:2019 年 2 月 27 日星期三 21:17:06 GMT
连接:keep-alive
传输编码:chunked

呜呜呜
呜呜
呜呜 ……
_

注意:消息是一一打印的。

如何使用 v3 方式实现上述目标?

4

1 回答 1

1

需要明确的是,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. 替换thisctx

编辑:另外,我相信这段代码有一个错误。您正在为每个请求创建一个新间隔,但从不清除它们。我认为这将被视为内存泄漏。

你可能应该做更多这样的事情:

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();
  }
}
于 2019-02-27T22:51:13.770 回答