При создании службы REST с использованием express в узле, как я могу предотвратить задачу блокировки от блокировки всей службы покоя? Возьмем в качестве примера следующую express службу отдыха:
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello, World'));
const blockService = async function () {
return new Promise((resolve, reject) => {
const end = Date.now() + 20000;
while (Date.now() < end) {
const doSomethingHeavyInJavaScript = 1 + 2 + 3;
}
resolve('I am done');
});
}
const blockController = function (req, res) {
blockService().then((val) => {
res.send(val);
});
};
app.get('/block', blockController);
app.listen(3000, () => console.log('app listening on port 3000'));
В этом случае вызов / block сделает весь сервис недоступным в течение 20 секунд. Это большая проблема, если есть много клиентов, использующих сервис, поскольку ни один другой клиент не сможет получить доступ к сервису в течение этого времени. Это, очевидно, проблема того, что в то время как l oop блокирует код и, таким образом, вешает основной поток. Этот код может сбивать с толку, поскольку, несмотря на использование обещания в blockService, основной поток все еще зависает. Как мне убедиться, что blockService будет запускать рабочий поток, а не событие-l oop?