Я столкнулся с проблемой при написании приложения Sapper, поэтому некоторое знакомство с ним, вероятно, поможет ответить ... хотя проблема также может быть в польке (например, экспресс) ... Я не уверен. Вот почему я здесь: -)
Вот упрощенный пример проблемы, с которой я столкнулся, и пытаюсь понять, почему. Это код для маршрута сервера Sapper, который возвращает JSON.
export function get(req, res) {
let arr = [];
let count = 0;
let data = {"somekey": "someval"}
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(data));
console.log('response sent');
while (count++ < 1000000000) {
arr.push(Math.random());
arr.pop();
}
console.log(arr[arr.length - 1]);
}
Я ожидаю, что этот код:
- Отправит строковый JSON клиенту
- Журнал консоли «ответ отправлен» на сервер
- После завершения цикла while консоль записывает в журнал последний элемент массива на сервере.
Вместо этого консоль регистрирует ответ, отправленный'на сервере, но клиент зависает, и сервер не отправляет ответ, пока не завершится цикл while.
Я думал, что res.end должен отправить ответ, как только он доберется до res.end, новместо этого он, кажется, движется дальше и возвращает ответ только после завершения функции get.
Почему это так? Это Сапер, Полька или мое собственное недопонимание того, как работает res.end?