0

我在 koa 中有一个端点,它从数据库中加载大量数据,然后根据它计算一些结果。这可能需要几秒钟。

如果浏览器取消请求,请求会发生什么?就像浏览器选项卡被关闭等。

例如,cache.c即使浏览器取消或 koa 足够聪明,可以简单地停止它为此请求启动的任何操作,也会被填充?

const cache = {}
router.get('/data', function *(next) {

  if (cache.c) return this.body = cache.c

  // somewhere here the browser cancels the request
  //---
  const a = yield db.getA()
  const b = yield db.getB()
  cache.c = yield calculateC(a,b)
  //---

  this.body = cache.c

})
4

1 回答 1

1

无论请求套接字何时关闭(例如,用户关闭选项卡),您的生成器函数都将全部生成/评估。

仅仅因为套接字关闭就停止生成器的进一步执行并不是 Koa 可以做出的假设。

例如,假设 Koa 执行了自动停止生成器,并且用户在yield query('ROLLBACK')有机会清理数据库连接之前关闭了套接字。现在你有一个糟糕的数据库连接卡在池中。也许还有比这更好的理由。

所以,是的,Koa 一直执行你的生成器函数,直到它完成,此时响应会通过你的中间件返回并返回到 Koa 的控制,因为套接字关闭,它无处可去。

如果您想知道用户何时关闭选项卡以便您可以实现自己的短路行为,您可以"close"在请求套接字上监听事件:

const cache = {}
router.get('/data', function *(next) {
  if (cache.c) return this.body = cache.c;

  var closed = false;
  this.request.socket.on('close', function() {
    closed = true;
  });

  if (closed) return;
  const a = yield db.getA();
  if (closed) return;
  const b = yield db.getB();
  if (closed) return;
  cache.c = yield calculateC(a,b);

  this.body = cache.c;
})
于 2015-12-20T12:59:34.817 回答