首页 文章

koa是否提供取消请求?

提问于
浏览
0

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

如果浏览器取消请求,请求会发生什么?就像浏览器标签被关闭等

例如,即使浏览器取消了,或者koa足够聪明,只是停止为此请求启动的任何操作,是否会填充 cache.c

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

})

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;
    })
    

相关问题