Я довольно смущен тем, почему мое обещание блокирует запросы приложений узла.NodeJS обещание блокировки запросов
Вот мой упрощенный код:
var express = require('express');
var someModule = require('somemodule');
app = express();
app.get('/', function (req, res) {
res.status(200).send('Main');
});
app.get('/status', function (req, res) {
res.status(200).send('Status');
});
// Init Promise
someModule.doSomething({}).then(function(){},function(){}, function(progress){
console.log(progress);
});
var server = app.listen(3000, function() {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s in %s environment',host, port, app.get('env'));
});
И модуль:
var q = require('q');
function SomeModule(){
this.doSomething = function(){
return q.Promise(function(resolve, reject, notify){
for (var i=0;i<10000;i++){
notify('Progress '+i);
}
resolve();
});
}
}
module.exports = SomeModule;
Очевидно, что это очень упрощена. Функция обещания выполняет некоторую работу, которая занимает от 5 до 30 минут и должна запускаться только при запуске сервера. Существует NO async работа в этом обе стороны функция. Его просто много обработки данных, петли и т. Д.
Я не буду иметь возможность делать запросы сразу же. Так что я ожидаю, когда я запускаю сервер, я могу сразу перейти на 127.0.0.1:3000
и посмотреть Main
и так же для любых других запросов.
В конце концов я хочу увидеть прогресс этой задачи, обратившись к /status
, но я уверен, что смогу сделать эту работу, как только сервер будет работать, как ожидалось.
В тот момент, когда я открываю /
не просто виснет, пока работа обещание заканчивается ..
Очевидно им делать что-то неправильно ...
JS не многопоточный, так что если у вас нет каких-либо асинхронной задачи в рамках своего обещания, и эта часть нуждается в 30мин, чтобы закончить, то он будет блокировать ваш сервер для 30мин. –
... и даже если у вас есть асинхронные задачи, если они связаны с процессором, они все равно будут «блокировать» цикл событий. – kliron
Вам придется переместить процесс, который занимает 30 минут, чтобы его собственный дочерний процесс, или закодировать его таким образом, чтобы он не блокировал цикл событий. –