【发布时间】:2014-02-12 20:05:13
【问题描述】:
我想将服务器高消耗 CPU 任务与用户体验分开:
./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!");
});
};
当请求“localhost:3000/resources/test/async”时,我希望浏览器呈现“Hello world,这应该立即发送”非常快,node.js 继续处理,一段时间后在控制台中出现“完成”消息。
相反,浏览器会一直等待,直到 node.js 完成大型任务然后呈现内容。我试过res.set({ 'Connection': 'close' }); 和res.end();,但没有任何效果。我也没有运气用谷歌搜索。
如何立即向客户端发送响应,服务器继续执行任务?
编辑
解决方案中的posted fork方法
【问题讨论】:
-
你试过用
res.end代替res.send -
是的,试过
res.set({ 'Connection': 'close' }); res.send(200, "Hello world, this should be sent inmediately"); res.end();
标签: javascript node.js asynchronous express