Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何开发node.js运行时策略?_Javascript_Node.js_Event Driven Design - Fatal编程技术网

Javascript 如何开发node.js运行时策略?

Javascript 如何开发node.js运行时策略?,javascript,node.js,event-driven-design,Javascript,Node.js,Event Driven Design,js方法是事件驱动的,我想知道如何解决何时触发事件的问题 假设我们在web应用程序上有一些操作:创建一些数据、服务页面、接收数据等 你将如何安排这些活动?在线程系统中,设计相当“简单”。您将线程专用于特定的任务集,并且沿着线程同步的道路前进。当这些任务处于低需求时,线程处于空闲状态,什么也不做。当需要它们时,它们运行它们的代码。虽然这条路有问题,但它有很好的文档记录,并得到了某种程度的解决 我发现很难用node.js事件的方式来处理事情。 我有10个请求,但我还没有创建任何数据,所以我无法提供任

js方法是事件驱动的,我想知道如何解决何时触发事件的问题

假设我们在web应用程序上有一些操作:创建一些数据、服务页面、接收数据等

你将如何安排这些活动?在线程系统中,设计相当“简单”。您将线程专用于特定的任务集,并且沿着线程同步的道路前进。当这些任务处于低需求时,线程处于空闲状态,什么也不做。当需要它们时,它们运行它们的代码。虽然这条路有问题,但它有很好的文档记录,并得到了某种程度的解决

我发现很难用node.js事件的方式来处理事情。 我有10个请求,但我还没有创建任何数据,所以我无法提供任何服务,创建数据是一个漫长的过程,另外5个客户端希望发送数据。现在怎么办

我创建了以下未经测试的代码,这基本上是一堆回调,它们被注册并应该执行。将有某种类型的堆管理器,它将运行并决定现在要执行哪些代码。由该回调创建的所有回调都可以“自然地”添加到偶数循环中。它还应该注册它的self,这样事件循环就可以将控件返回给它。其他东西,如静态内容和任何东西都可以进行不同的绑定

  • 如何将回调注册为当前事件循环状态中的最后一个调用
  • 这是解决这个问题的好办法吗
    当来自线程化环境时,要记住的最重要的一点是,在节点中,您不会等待某个操作完成,而是告诉它完成后要做什么。要做到这一点,您可以使用回调,这是一个包含要执行的函数的变量,或者是一个指向函数的指针(如果您愿意)

    例如:

     app.get('/details/:id?', function (req, res) {
        var id = req.params.ucid,
            publish = function (data) {
                res.send(data);
            };
        service.getDetails(id, publish);
    });
    
    一旦创建了所需的数据,就可以从get details方法中调用publish方法

    getDetail : function (id, callback) {
        var data = makeMyData(id);
        callback(data)
    }
    

    然后将数据发布回响应对象。由于事件循环节点将继续向此url提供请求,而不会中断从第一个请求生成的数据,因此选择的答案是最正确的,只有一个较小的代码更改,即:

    将此功能更改为:

    getDetail : function (id, callback) {
        var data = makeMyData(id);
        callback(data)
    }
    
    为此:

    getDetail : function (id, callback) {
        var data = makeMyData(id);
        setTimeout(callback, 0, data); 
    }
    
    2019年更新: 为了符合社区标准,我中断了对新答案的更新。 我使用了
    setTimeout
    ,因为我想将回调延迟到事件循环的后面。我使用的另一个选项是
    process.nextTick()
    ,这有助于将回调延迟到当前已处理事件的末尾。 例如:

    getDetail : function (id, callback) {
        var data = makeMyData(id);
        process.nextTick(((info)=> callback(info))(data)) 
    }
    

    那么,因为您注册了一个回调而没有从函数返回值,所以您实际上是在让事件循环处理它?回调(数据)不是在现场得到计算吗?你是对的,回调(数据)会在现场被调用,我恐怕这是一个很糟糕的例子。如果要执行冗长的I/O操作,最好使用事件发射器。一旦I/O或数据生成操作完成,它将发出一个完整的事件,该事件可能包含带有已填写数据的回调。有关事件发射器的更多信息,请参见,您可以随时重构您的答案。很抱歉,虽然这个答案很好,但它仍然是错误的,因此我不接受它。您可能希望从不同的角度检查一下这一点,它似乎与您的硬件体系结构的工作原理相同。但总结一下:将其与您的硬件体系结构进行比较。你的处理器比你的硬盘快得多,当你想读取一个文件时,操作系统会注册一个中断,当磁盘缓冲区中有可用数据时会收到通知,同时,它会去做其他事情。CPU总是很忙。当磁盘缓冲区有可用的数据时,会产生一个中断,然后操作系统可以为其指定一些CPU。所以,从来没有一个线程等待。这在NIO中也是同样的原则。代码从不阻塞线程。当有工作要做时,将分配一个线程来完成。