Node.js / express: natychmiast odpowiedz na żądanie klienta i kontynuuj zadania w nextTick
Chciałbym oddzielić zadanie serwera o dużym zużyciu procesora od doświadczenia użytkownika:
./main.js:
var express = require('express');
var Test = require('./resources/test');
var http = require('http');
var main = express();
main.set('port', process.env.PORT || 3000);
main.set('views', __dirname + '/views');
main.use(express.logger('dev'));
main.use(express.bodyParser());
main.use(main.router);
main.get('/resources/test/async', Test.testAsync);
main.configure('development', function() {
main.use(express.errorHandler());
});
http.createServer(main).listen(main.get('port'), function(){
console.log('Express server app listening on port ' + main.get('port'));
});
./resources/test.js:
function Test() {}
module.exports = Test;
Test.testAsync = function(req, res) {
res.send(200, "Hello world, this should be sent inmediately");
process.nextTick(function() {
console.log("Simulating large task");
for (var j = 0; j < 1000000000; j++) {
// Simulate large loop
}
console.log("phhhew!! Finished!");
});
};
Podczas żądania „localhost: 3000 / resources / test / async” oczekiwałbym, że renderowanie przeglądarki „Hello world, to powinno być wysłane natychmiast” naprawdę szybko i node.js, aby kontynuować przetwarzanie, a po chwili w konsoli pojawia się „gotowy” komunikat .
Zamiast tego przeglądarka czeka, aż node.js zakończy duże zadanie, a następnie wyświetli treść. Próbowałem zres.set({ 'Connection': 'close' });
i równieżres.end();
ale nic nie działa zgodnie z oczekiwaniami. Również nie mam szczęścia.
Jak powinno być natychmiastowe wysłanie odpowiedzi do klienta, a serwer kontynuował zadania?
EDYTOWAĆ
opublikowano metodę rozwidlenia w rozwiązaniu