Ваша функция генератора будет получена/оценена полностью независимо от того, когда закрывается сокет запроса (например, пользователь закрывает вкладку).
Остановка дальнейшего выполнения генератора только потому, что сокет закрывается, не является предположением, которое может сделать 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;
})
person
danneu
schedule
20.12.2015