【问题标题】:Online factorial program in nodejsnodejs中的在线阶乘程序
【发布时间】:2013-05-01 19:26:12
【问题描述】:

我想编写一个 nodejs 程序,计算所有小于 30 的数字的阶乘,这在新程序员中非常流行。

fact(0) = 1
fact(i) = i*fact(i-1)

但是这次我想让nodejs在客户端的网络浏览器上在线打印输出。

我知道如何编写阶乘代码,但我不知道如何在计算新的阶乘数时更新客户端视图。

【问题讨论】:

    标签: ajax node.js socket.io


    【解决方案1】:

    首先,处理器密集型任务应该在其他进程上完成。那是因为在你的节点 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);
        });
    });
    

    Herec9.io 上的完整项目。

    【讨论】:

    • “在所有小于 30 的数字中”,这根本不会让 Node 大汗淋漓。问题更多与将结果返回给用户有关,而不是如何构建 CPU 密集型 Node 应用程序。
    • @fardjad for funsies,计算调用 child_process.exec() 所需的时间,并将其与计算 150 的阶乘所需的时间进行比较。这是gist
    • @fardjad 您关注的问题在这里根本不是问题。是的,处理器密集型任务阻塞了主循环,但就像我说的,Node 是一个快速计算器,对于这种情况你的建议是多余的。我的笔记本电脑每秒达到 2500 个请求,其中 1000 个连接为每个连接计算 150!...
    • @emab 将numberElement.innerText(在html 变量中)替换为numberElement.innerHTML,使其在FF 中工作。
    • @emab 尝试将其作为一个新问题发布,它确实超出了这个问题的范围
    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    相关资源
    最近更新 更多