【发布时间】:2013-05-01 19:26:12
【问题描述】:
我想编写一个 nodejs 程序,计算所有小于 30 的数字的阶乘,这在新程序员中非常流行。
fact(0) = 1
fact(i) = i*fact(i-1)
但是这次我想让nodejs在客户端的网络浏览器上在线打印输出。
我知道如何编写阶乘代码,但我不知道如何在计算新的阶乘数时更新客户端视图。
【问题讨论】:
我想编写一个 nodejs 程序,计算所有小于 30 的数字的阶乘,这在新程序员中非常流行。
fact(0) = 1
fact(i) = i*fact(i-1)
但是这次我想让nodejs在客户端的网络浏览器上在线打印输出。
我知道如何编写阶乘代码,但我不知道如何在计算新的阶乘数时更新客户端视图。
【问题讨论】:
首先,处理器密集型任务应该在其他进程上完成。那是因为在你的节点 HTTP 服务器中这样做会阻塞主事件循环!
您可以在其他进程上进行计算,并通过标准流、套接字、数据库等将结果传输到您的 node.js 服务器进程。
我个人认为,node.js 不是进行此类计算的正确工具(我确信它可能适用于小数字)
Heroku 上的这篇文章将带您了解Building a Real-time, Polyglot Application with Node.js, Ruby, MongoDB and Socket.IO。
> I just want to know how to show my output to the client whenever something happens:
要使用 socket.io 执行此操作,您需要先安装它:
npm install socket.io
然后在你的节点应用程序中:
请注意,在此示例中,我会定期向客户端推送消息。
var http = require('http'),
io;
var html = "<!doctype html>" +
"<title>Socket.IO Example</title>" +
"<div id=\"number\"></div>" +
"<script src=\"/socket.io/socket.io.js\"></script>" +
"<script>" +
"var socket = io.connect()," +
"numberElement = document.getElementById('number');" +
"socket.on('message', function (data) {" +
//"numberElement.innerText = data;" +
"numberElement.innerHTML = data;" +
"});" +
"</script>";
var server = http.createServer(function (request, response) {
response.statusCode = 200;
response.setHeader('Content-Type', 'text/html');
response.end(html);
});
server.listen(8080);
io = require('socket.io').listen(server);
function push(socket) {
var i = 0;
return function () {
socket.send(String(i++ % 3600));
};
}
io.sockets.on('connection', function (socket) {
var interval = setInterval(push(socket), 1000);
socket.on('disconnect', function () {
clearInterval(interval);
});
});
【讨论】:
child_process.exec() 所需的时间,并将其与计算 150 的阶乘所需的时间进行比较。这是gist。
150!...
numberElement.innerText(在html 变量中)替换为numberElement.innerHTML,使其在FF 中工作。